diff --git a/test/web/xf_player_core_test.mjs b/test/web/xf_player_core_test.mjs index 4784f72..99663c4 100644 --- a/test/web/xf_player_core_test.mjs +++ b/test/web/xf_player_core_test.mjs @@ -162,6 +162,23 @@ test('live : la réserve visée couvre un silence du panneau de ~18 s', () => { assert.ok(c.liveBufferLatencyMinRemain > PROVIDER_OUTAGE_S); }); +test('live : la rafale de rattrapage après un silence ne fait pas sauter le programme', () => { + // Mesuré en prod : après un silence, le panneau renvoie d'un coup tout le + // retard ; l'avance a dépassé 45 s et le lecteur a sauté 2 fois de 20 s + // (programme perdu). Le retard doit se résorber en douceur (liveSync). + const observedPeakAhead = 45; + const c = liveMpegtsConfig(); + assert.ok(c.liveBufferLatencyMaxLatency >= 2 * observedPeakAhead - 10, + `saut dès ${c.liveBufferLatencyMaxLatency}s d'avance : la rafale de rattrapage le déclenche`); + assert.ok(c.liveSyncMaxLatency < observedPeakAhead, + 'liveSync doit déjà accélérer avant ce niveau'); +}); + +test('live : la vidéo déjà vue est purgée plus tôt, l\'avance étant plus grande', () => { + const c = liveMpegtsConfig(); + assert.ok(c.autoCleanupMaxBackwardDuration <= 30); +}); + test('reprise après coupure : attendre une vraie réserve avant de relire', () => { const calls = []; const listeners = {}; diff --git a/web/xf-player-core.js b/web/xf-player-core.js index 6c62c37..9be588e 100644 --- a/web/xf-player-core.js +++ b/web/xf-player-core.js @@ -512,8 +512,13 @@ // l'avance que le panneau envoie au démarrage. On la garde : ~25 s // de retard sur le direct, en échange d'une lecture qui traverse ces // silences sans figer. + // + // Saut seulement au-delà de 90 s : après un silence, le panneau + // renvoie d'un coup tout le retard. Avec un seuil à 45 s, l'avance + // le dépassait et le lecteur sautait 20 s de programme (2 fois en + // 1 min, mesuré). liveSync résorbe désormais cet excédent en douceur. liveBufferLatencyChasing: isLive, - liveBufferLatencyMaxLatency: 45, + liveBufferLatencyMaxLatency: 90, liveBufferLatencyMinRemain: 25, // Au-delà de 35 s de retard, accélérer légèrement (x1,1) jusqu'à // revenir à 25 s : rattrapage invisible, sans saut ni coupure. @@ -523,9 +528,11 @@ liveSyncPlaybackRate: 1.1, // Purge du buffer déjà lu : sans elle, une longue séance finit par // saturer le SourceBuffer (QuotaExceededError → erreur MPEG-TS). + // Avance jusqu'à 90 s : la vidéo déjà vue est purgée plus tôt pour + // rester sous le quota du SourceBuffer (~150 Mo en vidéo sur Chrome). autoCleanupSourceBuffer: true, - autoCleanupMaxBackwardDuration: 60, - autoCleanupMinBackwardDuration: 30, + autoCleanupMaxBackwardDuration: 30, + autoCleanupMinBackwardDuration: 15, lazyLoad: false } );