Lecture TV : plus de saut de 20 s après un silence du panneau

Télémétrie (session de 25 min avec la réserve de 25 s) : un silence du
panneau a été absorbé sans coupure (avance 27 → 14,7 s), mais à la
reprise le panneau renvoie d'un coup tout le retard. L'avance dépassait
alors le seuil de rattrapage (45 s) et le lecteur sautait 20 s de
programme — deux fois en une minute.

Saut seulement au-delà de 90 s de retard ; liveSync (x1,1 au-delà de
35 s) résorbe l'excédent en douceur. Vidéo déjà vue purgée plus tôt
(30 s) pour rester sous le quota du SourceBuffer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5.5 committed 2026-10-11 00:41:43 +02:00
1 parent 0539ad857f
commit 6733f80ffd
2 files changed
+27 -3

No files matched your search

+17
View File
@@ -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 = {};
+10 -3
View File
@@ -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
}
);