StreamUP Chapter Marker Manager

StreamUP Chapter Marker Manager v1.2.0

dany_k

New Member
I have just installed the plugin, but the chapters are not visible within the video. However, they do appear as separate .txt and .xml files saved in the same folder. I’ve tried both .mp4 and Hybrid MP4 formats, but neither VLC nor Final Cut Pro recognizes any markers or chapters.

Latest OB 31. MacOS Seq. 15
 

BennoBabe

New Member
Heads up to anyone downloading this for Mac: the chapters are not included in the video file (I am using Hybrid MP4), and the xml file is recognized as an "Uncompressed MusicXML" file, which is entirely unusable by any video editing software. I was hoping this would save time but it'll basically be the same as using twitch stream markers. Based on others commenting similar things in the last few months, I think this project might be dead.
 

criccroc

New Member
I have just installed the plugin, but the chapters are not visible within the video. However, they do appear as separate .txt and .xml files saved in the same folder. I’ve tried both .mp4 and Hybrid MP4 formats, but neither VLC nor Final Cut Pro recognizes any markers or chapters.

Latest OB 31. MacOS Seq. 15
Fino all'ultimo aggiornamento (prima della v.32 di OBS) questo plugin funziona benissimo. Con la nuova versione non viene riconosciuto :(
Imposta il video in mp4 ibrido. Fai partire la registrazione e scrivi qualcosa nella casella di testo. Termina la registrazione.
Ti crea il file video con i commenti che hai scritto e i marker, e come hai detto un file di testo anche questo con timestamp e commenti.
Per vedere i marker puoi utilizzare VLC (vedrai dei CAPITOLI con delle lineette e cliccandoci sopra leggerai i commenti, oppure vai sul menu RIPRODUZIONE - CAPITOLI), oppure utilizza programmi tipo Davinci Resolve (ho letto che anche su Premiere funziona) e vedrai tutti i marker.
 

Asternak

New Member
olá a todos tive o mesmo problema na ultima atualização e pedi para o Chat GPT fazer um script funcionou pra mim

omo solução alternativa, é possível usar um script em Lua dentro do próprio OBS que gera um arquivo .txt com as marcações de forma muito semelhante ao plugin original.

Como usar:​

  1. Baixe o script chapter_marker.lua.
  2. No OBS, vá em Ferramentas > Scripts.
  3. Clique no + e adicione o arquivo chapter_marker.lua.
  4. Escolha a pasta onde o OBS deve salvar o .txt com as marcações.
  5. Configure uma tecla de atalho em Configurações > Teclas de Atalho para adicionar capítulos durante a gravação.

Funcionamento:​

  • Sempre que você pressionar a tecla configurada, o script grava no arquivo .txt a hora exata da gravação junto com uma anotação.
  • Ao final, você terá um arquivo de texto com todos os pontos marcados para facilitar cortes e edições.

Essa solução é simples, funciona no OBS 32.0.0 e substitui bem o plugin original até que ele seja atualizado.


espero ter ajudado


vou deixar o script aqui e so colar no bloco de notas e salvar em .lua


-- chapter_marker.lua (versão robusta: salva um TXT com o MESMO NOME DO VÍDEO)
obs = obslua

local hotkey_id = obs.OBS_INVALID_HOTKEY_ID
local recording_running = false
local recording_start_time = nil
local marks = {}

function script_description()
return "Marca capítulos durante a gravação e, ao terminar, salva um arquivo .txt com o mesmo nome do vídeo."
end

function script_load(settings)
-- registra hotkey
hotkey_id = obs.obs_hotkey_register_frontend("chapter_marker", "Adicionar Capítulo", hotkey_pressed)
local hotkeys = obs.obs_data_get_array(settings, "chapter_marker")
obs.obs_hotkey_load(hotkey_id, hotkeys)
obs.obs_data_array_release(hotkeys)

-- registra callback de eventos (start/stop recording)
obs.obs_frontend_add_event_callback(on_event)
end

function script_save(settings)
local hotkeys = obs.obs_hotkey_save(hotkey_id)
obs.obs_data_set_array(settings, "chapter_marker", hotkeys)
obs.obs_data_array_release(hotkeys)
end

-- Evento do OBS (início / parada)
function on_event(event)
if event == obs.OBS_FRONTEND_EVENT_RECORDING_STARTED then
recording_running = true
-- tenta usar stats para maior precisão; se não, usa os.time
if obs.obs_frontend_get_recording_stats ~= nil then
local stats = obs.obs_frontend_get_recording_stats()
if stats and stats.total_time then
recording_start_time = os.time() - math.floor(stats.total_time/1000)
obs.obs_data_release(stats)
else
recording_start_time = os.time()
end
else
recording_start_time = os.time()
end
marks = {}
print("chapter_marker: gravação iniciada.")
elseif event == obs.OBS_FRONTEND_EVENT_RECORDING_STOPPED then
recording_running = false
print("chapter_marker: gravação parada; salvando arquivo de capítulos...")
save_chapter_file()
marks = {}
end
end

-- pega o caminho final do arquivo de vídeo (usa frontend output settings)
local function get_recording_filename()
if obs.obs_frontend_get_recording_output == nil then
return nil
end
local output = obs.obs_frontend_get_recording_output()
if not output then return nil end
local settings = obs.obs_output_get_settings(output)
local path = nil
if settings ~= nil then
path = obs.obs_data_get_string(settings, "path")
if (not path or path == "") then
-- tenta outras chaves que alguns outputs usam
path = obs.obs_data_get_string(settings, "file")
end
obs.obs_data_release(settings)
end
-- libera o output
if obs.obs_output_release ~= nil then
obs.obs_output_release(output)
end
return path
end

-- formata HH:MM:SS
local function format_hms(seconds)
local h = math.floor(seconds/3600)
local m = math.floor((seconds%3600)/60)
local s = math.floor(seconds%60)
return string.format("%02d:%02d:%02d", h, m, s)
end

-- tenta obter elapsed via stats (mais preciso); fallback para os.time
local function get_elapsed_seconds()
if obs.obs_frontend_get_recording_stats ~= nil then
local stats = obs.obs_frontend_get_recording_stats()
if stats and stats.total_time then
local secs = math.floor(stats.total_time / 1000)
obs.obs_data_release(stats)
return secs
end
end
if recording_start_time then
return os.time() - recording_start_time
end
return 0
end

-- hotkey: adiciona marcador em marks
function hotkey_pressed(pressed)
if not pressed then return end
if not recording_running then
print("chapter_marker: NÃO está gravando — marcador ignorado.")
return
end
local secs = get_elapsed_seconds()
local stamp = format_hms(secs)
table.insert(marks, stamp)
print("chapter_marker: capítulo marcado -> " .. stamp)
end

-- substitui extensão final por .txt (se não houver extensão, adiciona .txt)
local function make_txt_path_from_video_path(video_path)
if not video_path or video_path == "" then return nil end
-- tenta trocar a última extensão por .txt
local candidate = video_path:gsub("%.[^%.]+$", ".txt")
if candidate == video_path then
candidate = video_path .. ".txt"
end
return candidate
end

-- salva arquivo de capítulos (chama-se quando gravação pára)
function save_chapter_file()
if #marks == 0 then
print("chapter_marker: sem marcadores; nada a salvar.")
return
end

local video_path = get_recording_filename()
local txt_path = nil

if video_path and video_path ~= "" then
txt_path = make_txt_path_from_video_path(video_path)
else
-- fallback: salva na pasta do script com timestamp
local sp = ""
if script_path then sp = script_path() end
if sp ~= "" and sp:sub(-1) ~= "/" and sp:sub(-1) ~= "\\" then sp = sp .. "/" end
txt_path = sp .. "capitulos_" .. os.date("%Y%m%d_%H%M%S") .. ".txt"
end

local f, err = io.open(txt_path, "w")
if not f then
print("chapter_marker: erro ao criar '" .. tostring(txt_path) .. "': " .. tostring(err))
return
end
for i, line in ipairs(marks) do
f:write(line .. "\n")
end
f:close()
print("chapter_marker: capítulos salvos em: " .. tostring(txt_path))
end
 

Bruno ChrosS

New Member
olá a todos tive o mesmo problema na ultima atualização e pedi para o Chat GPT fazer um script funcionou pra mim

omo solução alternativa, é possível usar um script em Lua dentro do próprio OBS que gera um arquivo .txt com as marcações de forma muito semelhante ao plugin original.

Como usar:​

  1. Baixe o script chapter_marker.lua.
  2. No OBS, vá em Ferramentas > Scripts.
  3. Clique no + e adicione o arquivo chapter_marker.lua.
  4. Escolha a pasta onde o OBS deve salvar o .txt com as marcações.
  5. Configure uma tecla de atalho em Configurações > Teclas de Atalho para adicionar capítulos durante a gravação.

Funcionamento:​

  • Sempre que você pressionar a tecla configurada, o script grava no arquivo .txt a hora exata da gravação junto com uma anotação.
  • Ao final, você terá um arquivo de texto com todos os pontos marcados para facilitar cortes e edições.

Essa solução é simples, funciona no OBS 32.0.0 e substitui bem o plugin original até que ele seja atualizado.


espero ter ajudado


vou deixar o script aqui e so colar no bloco de notas e salvar em .lua


-- chapter_marker.lua (versão robusta: salva um TXT com o MESMO NOME DO VÍDEO)
obs = obslua

local hotkey_id = obs.OBS_INVALID_HOTKEY_ID
local recording_running = false
local recording_start_time = nil
local marks = {}

function script_description()
return "Marca capítulos durante a gravação e, ao terminar, salva um arquivo .txt com o mesmo nome do vídeo."
end

function script_load(settings)
-- registra hotkey
hotkey_id = obs.obs_hotkey_register_frontend("chapter_marker", "Adicionar Capítulo", hotkey_pressed)
local hotkeys = obs.obs_data_get_array(settings, "chapter_marker")
obs.obs_hotkey_load(hotkey_id, hotkeys)
obs.obs_data_array_release(hotkeys)

-- registra callback de eventos (start/stop recording)
obs.obs_frontend_add_event_callback(on_event)
end

function script_save(settings)
local hotkeys = obs.obs_hotkey_save(hotkey_id)
obs.obs_data_set_array(settings, "chapter_marker", hotkeys)
obs.obs_data_array_release(hotkeys)
end

-- Evento do OBS (início / parada)
function on_event(event)
if event == obs.OBS_FRONTEND_EVENT_RECORDING_STARTED then
recording_running = true
-- tenta usar stats para maior precisão; se não, usa os.time
if obs.obs_frontend_get_recording_stats ~= nil then
local stats = obs.obs_frontend_get_recording_stats()
if stats and stats.total_time then
recording_start_time = os.time() - math.floor(stats.total_time/1000)
obs.obs_data_release(stats)
else
recording_start_time = os.time()
end
else
recording_start_time = os.time()
end
marks = {}
print("chapter_marker: gravação iniciada.")
elseif event == obs.OBS_FRONTEND_EVENT_RECORDING_STOPPED then
recording_running = false
print("chapter_marker: gravação parada; salvando arquivo de capítulos...")
save_chapter_file()
marks = {}
end
end

-- pega o caminho final do arquivo de vídeo (usa frontend output settings)
local function get_recording_filename()
if obs.obs_frontend_get_recording_output == nil then
return nil
end
local output = obs.obs_frontend_get_recording_output()
if not output then return nil end
local settings = obs.obs_output_get_settings(output)
local path = nil
if settings ~= nil then
path = obs.obs_data_get_string(settings, "path")
if (not path or path == "") then
-- tenta outras chaves que alguns outputs usam
path = obs.obs_data_get_string(settings, "file")
end
obs.obs_data_release(settings)
end
-- libera o output
if obs.obs_output_release ~= nil then
obs.obs_output_release(output)
end
return path
end

-- formata HH:MM:SS
local function format_hms(seconds)
local h = math.floor(seconds/3600)
local m = math.floor((seconds%3600)/60)
local s = math.floor(seconds%60)
return string.format("%02d:%02d:%02d", h, m, s)
end

-- tenta obter elapsed via stats (mais preciso); fallback para os.time
local function get_elapsed_seconds()
if obs.obs_frontend_get_recording_stats ~= nil then
local stats = obs.obs_frontend_get_recording_stats()
if stats and stats.total_time then
local secs = math.floor(stats.total_time / 1000)
obs.obs_data_release(stats)
return secs
end
end
if recording_start_time then
return os.time() - recording_start_time
end
return 0
end

-- hotkey: adiciona marcador em marks
function hotkey_pressed(pressed)
if not pressed then return end
if not recording_running then
print("chapter_marker: NÃO está gravando — marcador ignorado.")
return
end
local secs = get_elapsed_seconds()
local stamp = format_hms(secs)
table.insert(marks, stamp)
print("chapter_marker: capítulo marcado -> " .. stamp)
end

-- substitui extensão final por .txt (se não houver extensão, adiciona .txt)
local function make_txt_path_from_video_path(video_path)
if not video_path or video_path == "" then return nil end
-- tenta trocar a última extensão por .txt
local candidate = video_path:gsub("%.[^%.]+$", ".txt")
if candidate == video_path then
candidate = video_path .. ".txt"
end
return candidate
end

-- salva arquivo de capítulos (chama-se quando gravação pára)
function save_chapter_file()
if #marks == 0 then
print("chapter_marker: sem marcadores; nada a salvar.")
return
end

local video_path = get_recording_filename()
local txt_path = nil

if video_path and video_path ~= "" then
txt_path = make_txt_path_from_video_path(video_path)
else
-- fallback: salva na pasta do script com timestamp
local sp = ""
if script_path then sp = script_path() end
if sp ~= "" and sp:sub(-1) ~= "/" and sp:sub(-1) ~= "\\" then sp = sp .. "/" end
txt_path = sp .. "capitulos_" .. os.date("%Y%m%d_%H%M%S") .. ".txt"
end

local f, err = io.open(txt_path, "w")
if not f then
print("chapter_marker: erro ao criar '" .. tostring(txt_path) .. "': " .. tostring(err))
return
end
for i, line in ipairs(marks) do
f:write(line .. "\n")
end
f:close()
print("chapter_marker: capítulos salvos em: " .. tostring(txt_path))
end
Funciona com capitulos via websocket?
 

hackerpro17

New Member
Will this get an update for OBS v32 compatibility?
I made fork because i need this plugin, and it's works on Archlinux.

Currently not tested on windows, no installer for windows and i can't test macOS because i don't have device.

Fork's Github
1761247324240.png
 

Andilippi

Member
Andilippi updated StreamUP Chapter Marker Manager with a new update entry:

StreamUP Chapter Marker Manager • v1.2.0

  • Added Final Cut Pro XML and Premiere Pro XML export options with NTSC handling and marker metadata
  • Added Edit Decision List (EDL) export for DaVinci Resolve workflows
  • Added a chapter history sidebar
  • Fixed recording timestamp drift and ensured export files close cleanly when recordings stop
  • Refined the dock UI, including a dedicated settings icon and spacing tweaks
  • Added en-GB locale entries and translated the new export controls

Read the rest of this update entry...
 
Top