From 9e97f45046ce6cf7346f95ad31556c5d65dca95f Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 10 Mar 2026 21:30:02 +0100 Subject: [PATCH] feat(player): increase buffering and stability for HLS and MPEG-TS --- web/player.html | 20 ++++++++++++-------- web/player_lite.html | 28 ++++++++++++++-------------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/web/player.html b/web/player.html index 5728ce7..95f0ef6 100644 --- a/web/player.html +++ b/web/player.html @@ -253,18 +253,18 @@ const isTurbo = urlParams.get('turbo') === 'true'; const hls = new Hls({ - maxBufferLength: 60, + maxBufferLength: 120, enableWorker: true, - liveSyncDurationCount: 5, // Balanced for desktop - nudgeOffset: 0.2, - nudgeMaxRetries: 10, - maxLiveSyncPlaybackRate: 1.1, + liveSyncDurationCount: 10, // Increased for desktop stability + nudgeOffset: 0.4, + nudgeMaxRetries: 15, + maxLiveSyncPlaybackRate: 1.15, // Turbo-Start specific startLevel: isTurbo ? 0 : -1, initialLiveManifestSize: 1, abrEwmaDefaultEstimate: 500000, - manifestLoadingRetryDelay: 800, - levelLoadingRetryDelay: 800 + manifestLoadingRetryDelay: 1000, + levelLoadingRetryDelay: 1000 }); window.hlsInstance = hls; hls.loadSource(url); @@ -290,7 +290,11 @@ log('Trying mpegts.js with: ' + url); showLoading('Chargement MPEG-TS...'); if (!mpegts.isSupported()) return false; - const player = mpegts.createPlayer({ type: 'mpegts', isLive: isLive, url: url }, { enableWorker: true, stashInitialSize: 1024 * 1024 }); + const player = mpegts.createPlayer({ type: 'mpegts', isLive: isLive, url: url }, { + enableWorker: true, + stashInitialSize: 512 * 1024, + maxStashSize: 20 * 1024 * 1024 // 20MB buffer capacity + }); player.attachMediaElement(video); player.load(); player.play().catch(() => playOverlay.style.display = 'flex'); diff --git a/web/player_lite.html b/web/player_lite.html index 7255d38..f539e61 100644 --- a/web/player_lite.html +++ b/web/player_lite.html @@ -245,22 +245,22 @@ const isTurbo = urlParams.get('turbo') === 'true'; const hls = new Hls({ - maxBufferLength: 60, // Increased for stability - maxMaxBufferLength: 120, + maxBufferLength: 120, // Doubled for stability + maxMaxBufferLength: 240, enableWorker: true, - liveSyncDurationCount: 6, // More distance from live edge (TiviMate style) - liveMaxLatencyDurationCount: 20, - lowLatencyMode: true, + liveSyncDurationCount: 12, // Increased distance from live edge (TiviMate style) for high latency + liveMaxLatencyDurationCount: 40, + lowLatencyMode: false, // Disabled for better stability on laggy connections // Robustness features - nudgeOffset: 0.2, // Jump over discontinuities - nudgeMaxRetries: 10, - maxLiveSyncPlaybackRate: 1.1, // Smooth catch-up + nudgeOffset: 0.5, // Jump over discontinuities more aggressively + nudgeMaxRetries: 20, + maxLiveSyncPlaybackRate: 1.2, // Smooth catch-up // Turbo-Start specific startLevel: isTurbo ? 0 : -1, initialLiveManifestSize: 1, abrEwmaDefaultEstimate: 500000, - manifestLoadingRetryDelay: 800, - levelLoadingRetryDelay: 800 + manifestLoadingRetryDelay: 1000, + levelLoadingRetryDelay: 1000 }); window.hlsInstance = hls; @@ -296,14 +296,14 @@ url: url }, { enableWorker: true, - stashInitialSize: isTurbo ? 1024 * 1024 : 1024 * 1024, // 1MB Large buffer for everyone + stashInitialSize: 512 * 1024, enableStashBuffer: true, liveBufferLatencyChasing: true, liveBufferLatencyChasingOnPaused: true, - liveBufferLatencyMaxLatency: 3.0, // Safety margin - liveBufferLatencyMinLatency: 1.0, + liveBufferLatencyMaxLatency: 10.0, + liveBufferLatencyMinLatency: 2.0, lazyLoad: false, - maxStashSize: 2 * 1024 * 1024 // 2MB Max + maxStashSize: 20 * 1024 * 1024 }); player.attachMediaElement(video);