From 4947646cb3d96eb89d03daf97e551de69b809bea Mon Sep 17 00:00:00 2001 From: Seth Van Niekerk Date: Tue, 18 Nov 2025 14:40:37 -0500 Subject: [PATCH] further optimization --- src/ffmpegConfig.js | 20 ++++++++++++-------- src/streamHandler.js | 17 +++++++++++++++-- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/ffmpegConfig.js b/src/ffmpegConfig.js index 32635d6..9e766bd 100644 --- a/src/ffmpegConfig.js +++ b/src/ffmpegConfig.js @@ -56,7 +56,7 @@ async function buildFFmpegArgs({ fps, useMusic, musicPath }) { '-preset', 'ultrafast', '-tune', 'zerolatency', '-pix_fmt', 'yuv420p', - '-g', fps.toString(), // Keyframe every second for 1s segments + '-g', (fps * 2).toString(), // Keyframe every 2 seconds for 2s segments '-bf', '0', // No B-frames for lower latency '-x264opts', 'nal-hrd=cbr:no-scenecut', // Constant bitrate, no scene detection '-b:v', '2500k', // Target bitrate for stable encoding @@ -75,12 +75,14 @@ async function buildFFmpegArgs({ fps, useMusic, musicPath }) { '-max_interleave_delta', '500000', // Increased for smoother transitions (500ms) '-err_detect', 'ignore_err', // Continue on minor audio errors '-f', 'hls', - '-hls_time', '1', // Smaller segments for faster startup - '-hls_list_size', '3', // Fewer segments in playlist - '-hls_flags', 'delete_segments+omit_endlist', + '-hls_time', '2', // 2-second segments for better buffering + '-hls_list_size', '10', // Keep more segments in playlist for slower clients + '-hls_flags', 'omit_endlist+program_date_time+independent_segments', + '-hls_segment_type', 'mpegts', '-hls_start_number_source', 'epoch', '-start_number', '0', // Start from segment 0 '-flush_packets', '1', // Flush packets immediately + '-hls_allow_cache', '0', // Disable client caching 'pipe:1' ); @@ -98,19 +100,21 @@ async function buildFFmpegArgs({ fps, useMusic, musicPath }) { '-preset', 'ultrafast', '-tune', 'zerolatency', '-pix_fmt', 'yuv420p', - '-g', fps.toString(), // Keyframe every second for 1s segments + '-g', (fps * 2).toString(), // Keyframe every 2 seconds for 2s segments '-bf', '0', '-x264opts', 'nal-hrd=cbr:no-scenecut', '-b:v', '2500k', '-maxrate', '2500k', '-bufsize', '5000k', '-f', 'hls', - '-hls_time', '1', // Smaller segments for faster startup - '-hls_list_size', '3', // Fewer segments in playlist - '-hls_flags', 'delete_segments+omit_endlist', + '-hls_time', '2', // 2-second segments for better buffering + '-hls_list_size', '10', // Keep more segments in playlist for slower clients + '-hls_flags', 'omit_endlist+program_date_time+independent_segments', + '-hls_segment_type', 'mpegts', '-hls_start_number_source', 'epoch', '-start_number', '0', '-flush_packets', '1', // Flush packets immediately + '-hls_allow_cache', '0', // Disable client caching 'pipe:1' ); diff --git a/src/streamHandler.js b/src/streamHandler.js index 16fb56a..2763fc3 100644 --- a/src/streamHandler.js +++ b/src/streamHandler.js @@ -33,6 +33,7 @@ async function streamHandler(req, res, { useMusic = false, musicPath, lateGeocod let isCleaningUp = false; let playlistFile = null; let cleanup; // Declare cleanup function variable early + let streamId = '[STREAM]'; // Default stream ID try { // Set HLS headers @@ -65,6 +66,18 @@ async function streamHandler(req, res, { useMusic = false, musicPath, lateGeocod '--mute-audio', '--disable-breakpad', '--disable-component-update', + // Resource limits (safe optimizations) + '--disable-renderer-backgrounding', + '--disable-backgrounding-occluded-windows', + '--js-flags=--max-old-space-size=512', // Limit V8 heap to 512MB + '--renderer-process-limit=2', // Limit to 2 renderer processes + // Disable unnecessary features + '--disable-databases', + '--disable-plugins', + '--disable-notifications', + '--disable-features=AudioServiceOutOfProcess,TranslateUI', + '--autoplay-policy=no-user-gesture-required', + '--disable-blink-features=AutomationControlled', `--window-size=${width},${height}`, `--force-device-scale-factor=1` ], @@ -76,8 +89,8 @@ async function streamHandler(req, res, { useMusic = false, musicPath, lateGeocod browser = browserInstance; playlistFile = ffmpegConfig.playlistFile; - // Create stream identifier from browser process PID - const streamId = `[${browser.process()?.pid || 'STREAM'}]`; + // Update stream identifier from browser process PID + streamId = `[${browser.process()?.pid || 'STREAM'}]`; // Start FFmpeg immediately ffmpegProcess = spawn('ffmpeg', ['-loglevel', 'error', '-hide_banner', ...ffmpegConfig.args], {