StreamUP Chapter Marker Manager

StreamUP Chapter Marker Manager v1.2.0

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
 
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.
 
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.
 
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
 
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?
 
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 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...
 
Hi Andy,

Thanks for this. (Always watch your channel, great help).

Small request for the export of markers. Format like this:

00:00:01.000 hello 00:00:05.000 five 00:00:10.406 ten 00:00:20.300 twenty 00:00:25.978 two five 00:00:30.726 good!

This is a tab delimited list (time [tab] name) which can be copied directly into Magic Vegas Edit area.

It is only the markers, the media is not relevant as that is imported separately, (importunely the hybrid MP4 method doesn't work in Vegas at the moment.)

Of course, easy enough to parse the existing text file but this would save a few steps.

I suppose if you wanted to, you could consider adding an option to the text output to allow the user to customize the format but anyway, hehe.

Thanks again for your great work.

I also do tutorials some coding, my stuff is mainly composing and sound design for Steinberg.
 
I have been using StreamUP Chapter Marker on Windows, and it works flawlessly. Now, I am switching to MacOS with the latest OS and latest OBS and StreamUP Chapter Marker latest version. Somehow I can not get any Chapter added to the video file. Standard OBS chapter works fine.

For now going to use EDL file. This is awesome new feature.

Help appriciated, TIA.

This is my log:

Code:
10:22:43.705: [macOS] Permission for audio device access granted.
10:22:43.708: [macOS] Permission for video device access granted.
10:22:43.708: [macOS] Permission for input monitoring granted.
10:22:43.713: [macOS] Permission for screen capture granted.
10:22:43.714: CPU Name: Apple M4
10:22:43.714: Physical Cores: 10, Logical Cores: 10
10:22:43.714: Physical Memory: 24576MB Total
10:22:43.714: Model Identifier: Mac16,10
10:22:43.714: OS Name: macOS
10:22:43.714: OS Version: Version 26.3.1 (Build 25D2128)
10:22:43.714: Rosetta translation used: false
10:22:43.714: Kernel Version: 25.3.0
10:22:43.715: hotkeys-cocoa: Using keyboard layout 'com.apple.keylayout.ABC'
10:22:43.715: Current Date/Time: 2026-03-14, 10:22:43
10:22:43.715: Browser Hardware Acceleration: true
10:22:43.715: Qt Version: 6.8.3 (runtime), 6.8.3 (compiled)
10:22:43.715: Portable mode: false
10:22:43.815: OBS 32.0.4 (mac)
10:22:43.815: ---------------------------------
10:22:43.817: ---------------------------------
10:22:43.817: audio settings reset:
10:22:43.817:     samples per sec: 48000
10:22:43.817:     speakers:        2
10:22:43.817:     max buffering:   960 milliseconds
10:22:43.817:     buffering type:  dynamically increasing
10:22:43.818: ---------------------------------
10:22:43.818: Initializing OpenGL...
10:22:43.845: Loading up OpenGL on adapter Apple Apple M4
10:22:43.845: OpenGL loaded successfully, version 4.1 Metal - 90.5, shading language 4.10
10:22:43.974: ---------------------------------
10:22:43.974: video settings reset:
10:22:43.974:     base resolution:   2560x1440
10:22:43.974:     output resolution: 1920x1080
10:22:43.974:     downscale filter:  Bicubic
10:22:43.974:     fps:               60/1
10:22:43.974:     format:            NV12
10:22:43.974:     YUV mode:          Rec. 709/Partial
10:22:43.974: NV12 texture support enabled
10:22:43.974: P010 texture support not available
10:22:43.977: Audio monitoring device:
10:22:43.977:     name: Default
10:22:43.977:     id: default
10:22:43.979: ---------------------------------
10:22:43.982: No AJA devices found, skipping loading AJA UI plugin
10:22:43.982: Failed to initialize module 'aja-output-ui'
10:22:43.984: No AJA devices found, skipping loading AJA plugin
10:22:43.984: Failed to initialize module 'aja'
10:22:43.985: Failed to load 'en-US' text for module: 'decklink-captions'
10:22:43.986: Failed to load 'en-US' text for module: 'decklink-output-ui'
10:22:43.987: A DeckLink iterator could not be created.  The DeckLink drivers may not be installed
10:22:43.987: Failed to initialize module 'decklink'
10:22:44.093: [obs-browser]: Version 2.26.3
10:22:44.093: [obs-browser]: CEF Version 127.0.6533.120 (runtime), 127.0.0-6533-fix-stutter.3039+g2b7d20b+chromium-127.0.6533.120 (compiled)
10:22:44.104: [obs-websocket] [obs_module_load] you can haz websockets (Version: 5.6.3 | RPC Version: 1)
10:22:44.104: [obs-websocket] [obs_module_load] Qt version (compile-time): 6.8.3 | Qt version (run-time): 6.8.3
10:22:44.104: [obs-websocket] [obs_module_load] Linked ASIO Version: 103200
10:22:44.106: [obs-websocket] [obs_module_load] Module loaded.
10:22:44.112: os_dlopen(/Applications/VLC.app/Contents/MacOS/lib/libvlccore.dylib->/Applications/VLC.app/Contents/MacOS/lib/libvlccore.dylib): dlopen(/Applications/VLC.app/Contents/MacOS/lib/libvlccore.dylib, 0x0106): tried: '/Applications/VLC.app/Contents/MacOS/lib/libvlccore.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/Applications/VLC.app/Contents/MacOS/lib/libvlccore.dylib' (no such file), '/Applications/VLC.app/Contents/MacOS/lib/libvlccore.dylib' (no such file)
10:22:44.112:
10:22:44.112: [vlc-video]: Couldn't find VLC installation, VLC video source disabled
10:22:44.114: [StreamUP Record Chapter Manager] loaded version 1.2.0
10:22:44.114: os_dlopen(obs-frontend-api->obs-frontend-api.so): dlopen(obs-frontend-api.so, 0x0106): tried: 'obs-frontend-api.so' (relative path not allowed in hardened program), '/System/Volumes/Preboot/Cryptexes/OSobs-frontend-api.so' (no such file), '/Applications/OBS.app/Contents/Frameworks/obs-frontend-api.so' (no such file), '/Applications/OBS.app/Contents/Frameworks/obs-frontend-api.so' (no such file), '/usr/lib/obs-frontend-api.so' (no such file, not in dyld cache), 'obs-frontend-api.so' (relative path not allowed in hardened program)
10:22:44.114:
10:22:44.117: [StreamUP Record Chapter Manager] Settings loaded successfully from /Users/kus/Library/Application Support/obs-studio/plugin_config/streamup-record-chapter-manager/configs.json
10:22:44.117: ---------------------------------
10:22:44.117:   Loaded Modules:
10:22:44.117:     streamup-record-chapter-manager
10:22:44.117:     vlc-video
10:22:44.117:     text-freetype2
10:22:44.117:     rtmp-services
10:22:44.117:     obs-x264
10:22:44.117:     obs-websocket
10:22:44.117:     obs-webrtc
10:22:44.117:     obs-vst
10:22:44.117:     obs-transitions
10:22:44.117:     obs-outputs
10:22:44.117:     obs-filters
10:22:44.117:     obs-ffmpeg
10:22:44.117:     obs-browser
10:22:44.117:     mac-virtualcam
10:22:44.117:     mac-videotoolbox
10:22:44.117:     mac-syphon
10:22:44.117:     mac-capture
10:22:44.117:     mac-avcapture
10:22:44.117:     mac-avcapture-legacy
10:22:44.117:     image-source
10:22:44.117:     frontend-tools
10:22:44.117:     decklink-output-ui
10:22:44.117:     decklink-captions
10:22:44.117:     coreaudio-encoder
10:22:44.117: ---------------------------------
10:22:44.117: [obs-websocket] [obs_module_post_load] WebSocket server is enabled, starting...
10:22:44.117: [obs-websocket] [WebSocketServer::Start] Not locked to IPv4 bindings
10:22:44.117: [obs-websocket] [WebSocketServer::ServerRunner] IO thread started.
10:22:44.117: [obs-websocket] [WebSocketServer::Start] Server started successfully on port 4455. Possible connect address: 192.168.18.168
10:22:44.117: [VideoToolbox encoder]: Added VideoToolbox encoders
10:22:44.117: ---------------------------------
10:22:44.117: Available Encoders:
10:22:44.117:   Video Encoders:
10:22:44.117:     - ffmpeg_aom_av1 (AOM AV1)
10:22:44.117:     - obs_x264 (x264)
10:22:44.117:     - com.apple.videotoolbox.videoencoder.prores-422 (Apple VT ProRes Software Encoder)
10:22:44.117:     - com.apple.videotoolbox.videoencoder.appleproreshw.422 (Apple VT ProRes Hardware Encoder)
10:22:44.117:     - com.apple.videotoolbox.videoencoder.ave.avc (Apple VT H264 Hardware Encoder)
10:22:44.117:     - com.apple.videotoolbox.videoencoder.h264 (Apple VT H264 Software Encoder)
10:22:44.117:     - com.apple.videotoolbox.videoencoder.ave.hevc (Apple VT HEVC Hardware Encoder)
10:22:44.117:     - com.apple.videotoolbox.videoencoder.hevc.vcp (Apple VT HEVC Software Encoder)
10:22:44.117:   Audio Encoders:
10:22:44.117:     - CoreAudio_AAC (CoreAudio AAC)
10:22:44.117:     - ffmpeg_aac (FFmpeg AAC)
10:22:44.117:     - ffmpeg_opus (FFmpeg Opus)
10:22:44.117:     - ffmpeg_pcm_s16le (FFmpeg PCM (16-bit))
10:22:44.117:     - ffmpeg_pcm_s24le (FFmpeg PCM (24-bit))
10:22:44.117:     - ffmpeg_pcm_f32le (FFmpeg PCM (32-bit float))
10:22:44.117:     - ffmpeg_alac (FFmpeg ALAC (24-bit))
10:22:44.117:     - ffmpeg_flac (FFmpeg FLAC (16-bit))
10:22:44.117: ==== Startup complete ===============================================
10:22:44.160: All scene data cleared
10:22:44.160: ------------------------------------------------
10:22:44.307: Downmix enabled: 2 to 2 channels.
10:22:44.314: Video Capture Device: Selected device 'Elgato 4K X'
10:22:44.333: adding 64 milliseconds of audio buffering, total audio buffering is now 64 milliseconds (source: macOS Screen Capture)
10:22:44.333:
10:22:44.339: Video Capture Device: Capturing 'Elgato 4K X' (0x12000000fd9009c):
10:22:44.339:  Using Format          : 2560x1440 (16:9) - 29.97, 30, 50, 59.94, 60, 120, 144 FPS - CS 709 - NV12 (420v)
10:22:44.339:  FPS                   : 60.0002 (60000240/1000000)
10:22:44.339:  Frame Interval        : 0.0166666 s
10:22:44.339:
10:22:44.376: coreaudio: Device 'Elgato 4K X' [48000 Hz] initialized
10:22:44.399: Switched to scene 'Scene'
10:22:44.399: ------------------------------------------------
10:22:44.399: Loaded scenes:
10:22:44.399: - scene 'Scene':
10:22:44.399:     - source: 'macOS Screen Capture' (screen_capture)
10:22:44.399:     - source: 'Video Capture Device' (macos-avcapture)
10:22:44.399:         - filter: 'Colour Correction' (color_filter_v2)
10:22:44.399:     - source: 'Audio Input Capture' (coreaudio_input_capture)
10:22:44.399:         - monitoring: monitor and output
10:22:44.399: ------------------------------------------------
10:22:44.572: [mac-virtualcam] macOS Camera Extension user approval required.
10:22:48.369: [obs-websocket] [WebSocketServer::onOpen] New WebSocket client has connected from [::ffff:127.0.0.1]:52049
10:22:48.717: [obs-websocket] [WebSocketServer::onOpen] New WebSocket client has connected from [::ffff:127.0.0.1]:52050
10:22:51.441: [VideoToolbox advanced_video_recording: 'h264']: session created with hardware encoding
10:22:51.446: [VideoToolbox advanced_video_recording: 'h264']: settings:
10:22:51.446:     vt_encoder_id          com.apple.videotoolbox.videoencoder.ave.avc
10:22:51.446:     rate_control:          CBR
10:22:51.446:     bitrate:               2500 (kbps)
10:22:51.446:     quality:               0.600000
10:22:51.446:     fps_num:               60
10:22:51.446:     fps_den:               1
10:22:51.446:     width:                 1920
10:22:51.446:     height:                1080
10:22:51.446:     keyint:                2 (s)
10:22:51.446:     limit_bitrate:         off
10:22:51.446:     rc_max_bitrate:        2500 (kbps)
10:22:51.446:     rc_max_bitrate_window: 1.500000 (s)
10:22:51.446:     hw_enc:                on
10:22:51.446:     spatial_aq:            off
10:22:51.446:     profile:               high
10:22:51.446:     codec_type:            h264
10:22:51.446:
10:22:51.448: [CoreAudio AAC: 'Track1']: settings:
10:22:51.448:     mode:          AAC
10:22:51.448:     bitrate:       160
10:22:51.448:     sample rate:   48000
10:22:51.448:     cbr:           on
10:22:51.448:     output buffer: 1536
10:22:51.449: [StreamUP Record Chapter Manager] Recording started at frame: 448
10:22:51.449: [StreamUP Record Chapter Manager] Recording path: /Users/kus/Movies/2026-03-14 10-22-51.mp4
10:22:51.449: [StreamUP Record Chapter Manager] Created EDL chapter file: /Users/kus/Movies/2026-03-14 10-22-51_chapters.edl
10:22:51.449: [StreamUP Record Chapter Manager] Added chapter marker: Start
10:22:51.453: ==== Recording Start ===============================================
10:22:51.453: [mp4 output: 'adv_file_output'] Writing Hybrid MP4/MOV file '/Users/kus/Movies/2026-03-14 10-22-51.mp4'...
10:22:52.699: [StreamUP Record Chapter Manager] Added chapter marker: Chapter 1
10:22:54.457: [StreamUP Record Chapter Manager] Added chapter marker: Side Quest
10:22:54.457: [StreamUP Record Chapter Manager] Added chapter marker for: Side Quest
10:22:55.917: [StreamUP Record Chapter Manager] Added chapter marker: Collectible
10:22:55.917: [StreamUP Record Chapter Manager] Added chapter marker for: Collectible
10:22:57.184: [StreamUP Record Chapter Manager] Added chapter marker: Main Quest
10:22:57.185: [StreamUP Record Chapter Manager] Added chapter marker for: Main Quest
10:23:00.398: [mp4 muxer: 'adv_file_output'] Flushing final fragment...
10:23:00.398: [mp4 muxer: 'adv_file_output'] Number of fragments: 5
10:23:00.398: [mp4 muxer: 'adv_file_output'] Full moov size: 9 KiB
10:23:00.398: [mp4 muxer: 'adv_file_output'] Final mdat size: 2708 KiB
10:23:00.398: Output 'adv_file_output': stopping
10:23:00.398: Output 'adv_file_output': Total frames output: 529
10:23:00.398: Output 'adv_file_output': Total drawn frames: 537
10:23:00.398: [mp4 output: 'adv_file_output'] Waiting for file writer to finish...
10:23:00.398: [mp4 output: 'adv_file_output'] File output complete. Finalization took 0 ms.
10:23:00.398: ==== Recording Stop ================================================
10:23:00.399: [StreamUP Record Chapter Manager] chapterCount: 2
 
Last edited:
For MacOS users, there's workaround for missing chapters on MP4.
Use https://subler.org/ to inject timestamp from stream up .txt file. But remove the first line. Open up the hybrid MP4, and then drag the txt, and save. The remuxed mp4 will have marker.
 
Back
Top