further optimization
This commit is contained in:
@@ -56,7 +56,7 @@ async function buildFFmpegArgs({ fps, useMusic, musicPath }) {
|
|||||||
'-preset', 'ultrafast',
|
'-preset', 'ultrafast',
|
||||||
'-tune', 'zerolatency',
|
'-tune', 'zerolatency',
|
||||||
'-pix_fmt', 'yuv420p',
|
'-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
|
'-bf', '0', // No B-frames for lower latency
|
||||||
'-x264opts', 'nal-hrd=cbr:no-scenecut', // Constant bitrate, no scene detection
|
'-x264opts', 'nal-hrd=cbr:no-scenecut', // Constant bitrate, no scene detection
|
||||||
'-b:v', '2500k', // Target bitrate for stable encoding
|
'-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)
|
'-max_interleave_delta', '500000', // Increased for smoother transitions (500ms)
|
||||||
'-err_detect', 'ignore_err', // Continue on minor audio errors
|
'-err_detect', 'ignore_err', // Continue on minor audio errors
|
||||||
'-f', 'hls',
|
'-f', 'hls',
|
||||||
'-hls_time', '1', // Smaller segments for faster startup
|
'-hls_time', '2', // 2-second segments for better buffering
|
||||||
'-hls_list_size', '3', // Fewer segments in playlist
|
'-hls_list_size', '10', // Keep more segments in playlist for slower clients
|
||||||
'-hls_flags', 'delete_segments+omit_endlist',
|
'-hls_flags', 'omit_endlist+program_date_time+independent_segments',
|
||||||
|
'-hls_segment_type', 'mpegts',
|
||||||
'-hls_start_number_source', 'epoch',
|
'-hls_start_number_source', 'epoch',
|
||||||
'-start_number', '0', // Start from segment 0
|
'-start_number', '0', // Start from segment 0
|
||||||
'-flush_packets', '1', // Flush packets immediately
|
'-flush_packets', '1', // Flush packets immediately
|
||||||
|
'-hls_allow_cache', '0', // Disable client caching
|
||||||
'pipe:1'
|
'pipe:1'
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -98,19 +100,21 @@ async function buildFFmpegArgs({ fps, useMusic, musicPath }) {
|
|||||||
'-preset', 'ultrafast',
|
'-preset', 'ultrafast',
|
||||||
'-tune', 'zerolatency',
|
'-tune', 'zerolatency',
|
||||||
'-pix_fmt', 'yuv420p',
|
'-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',
|
'-bf', '0',
|
||||||
'-x264opts', 'nal-hrd=cbr:no-scenecut',
|
'-x264opts', 'nal-hrd=cbr:no-scenecut',
|
||||||
'-b:v', '2500k',
|
'-b:v', '2500k',
|
||||||
'-maxrate', '2500k',
|
'-maxrate', '2500k',
|
||||||
'-bufsize', '5000k',
|
'-bufsize', '5000k',
|
||||||
'-f', 'hls',
|
'-f', 'hls',
|
||||||
'-hls_time', '1', // Smaller segments for faster startup
|
'-hls_time', '2', // 2-second segments for better buffering
|
||||||
'-hls_list_size', '3', // Fewer segments in playlist
|
'-hls_list_size', '10', // Keep more segments in playlist for slower clients
|
||||||
'-hls_flags', 'delete_segments+omit_endlist',
|
'-hls_flags', 'omit_endlist+program_date_time+independent_segments',
|
||||||
|
'-hls_segment_type', 'mpegts',
|
||||||
'-hls_start_number_source', 'epoch',
|
'-hls_start_number_source', 'epoch',
|
||||||
'-start_number', '0',
|
'-start_number', '0',
|
||||||
'-flush_packets', '1', // Flush packets immediately
|
'-flush_packets', '1', // Flush packets immediately
|
||||||
|
'-hls_allow_cache', '0', // Disable client caching
|
||||||
'pipe:1'
|
'pipe:1'
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ async function streamHandler(req, res, { useMusic = false, musicPath, lateGeocod
|
|||||||
let isCleaningUp = false;
|
let isCleaningUp = false;
|
||||||
let playlistFile = null;
|
let playlistFile = null;
|
||||||
let cleanup; // Declare cleanup function variable early
|
let cleanup; // Declare cleanup function variable early
|
||||||
|
let streamId = '[STREAM]'; // Default stream ID
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Set HLS headers
|
// Set HLS headers
|
||||||
@@ -65,6 +66,18 @@ async function streamHandler(req, res, { useMusic = false, musicPath, lateGeocod
|
|||||||
'--mute-audio',
|
'--mute-audio',
|
||||||
'--disable-breakpad',
|
'--disable-breakpad',
|
||||||
'--disable-component-update',
|
'--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}`,
|
`--window-size=${width},${height}`,
|
||||||
`--force-device-scale-factor=1`
|
`--force-device-scale-factor=1`
|
||||||
],
|
],
|
||||||
@@ -76,8 +89,8 @@ async function streamHandler(req, res, { useMusic = false, musicPath, lateGeocod
|
|||||||
browser = browserInstance;
|
browser = browserInstance;
|
||||||
playlistFile = ffmpegConfig.playlistFile;
|
playlistFile = ffmpegConfig.playlistFile;
|
||||||
|
|
||||||
// Create stream identifier from browser process PID
|
// Update stream identifier from browser process PID
|
||||||
const streamId = `[${browser.process()?.pid || 'STREAM'}]`;
|
streamId = `[${browser.process()?.pid || 'STREAM'}]`;
|
||||||
|
|
||||||
// Start FFmpeg immediately
|
// Start FFmpeg immediately
|
||||||
ffmpegProcess = spawn('ffmpeg', ['-loglevel', 'error', '-hide_banner', ...ffmpegConfig.args], {
|
ffmpegProcess = spawn('ffmpeg', ['-loglevel', 'error', '-hide_banner', ...ffmpegConfig.args], {
|
||||||
|
|||||||
Reference in New Issue
Block a user