Waarom HLS-livevideo achterloopt en waar 'Naar live' naartoe moet springen

Meet HLS-livelatency zonder playlist-edge, klokvertraging, veiligheidsmarge, verouderde manifests en Low-Latency HLS door elkaar te halen.

Twee kijkers kunnen dezelfde HLS-uitzending op verschillende posities bekijken, terwijl beide players “Live” tonen. Een voortgangsbalk kan zijn rechterrand bereiken en toch enkele seconden achterlopen op de bron. Ook kan een knop Naar live de weergave minder stabiel maken wanneer deze naar het laatst aangekondigde tijdstip springt in plaats van naar een ondersteunde live-syncpositie.

Behandel latency daarom niet als één getal. Houd brontijd, beschikbaarheid in de playlist, de afstand van de afspeelpositie tot de playlist-edge, de veiligheidsmarge van de player en de uiteindelijke weergavetijd uit elkaar. Test uitsluitend streams waarvan je eigenaar bent of waarvoor je toestemming hebt. Verwijder ondertekende URL's, cookies, kijkers-ID's, IP-adressen en interne hostnamen uit gedeelde traces.

Verificatiemethode — 23 september 2026: we hebben met Node.js 24.12.0 een deterministische berekening uitgevoerd op een synthetische mediaplaylist met vijf segmenten van zes seconden en EXT-X-PROGRAM-DATE-TIME vanaf 16:00:00 UTC. Het aangekondigde venster eindigde om 16:00:30 en werd om 16:00:32 waargenomen. Een afspeelpositie op mediatijd 6 lag 24 seconden achter de playlist-edge en 26 seconden achter op de klok van de fixture. Met een bewust gekozen veiligheidsmarge van 12 seconden werd mediatijd 18 het gecontroleerde Naar live-doel: 12 seconden achter de playlist-edge en 14 seconden achter op de klok van de fixture. Hiermee is alleen de playlistberekening van het script geverifieerd. Er is geen encoder, netwerk, CDN, browsermediapijplijn, apparaatklok, echte weergave of end-to-endservicedoel gemeten. Het script staat in scripts/test-hls-live-latency-budget.cjs.

Benoem de drie posities voordat je ze vergelijkt

De term “live-edge” wordt vaak voor verschillende posities gebruikt. Geef elke observatie in logs en dashboards een eigen naam.

Positie of metingPraktische definitieBron van het bewijs
Playlist-edgeEinde van de nieuwste media die momenteel aan deze client wordt aangekondigdMediaplaylist plus duur van segmenten of parts
Einde van het bereikLaatste tijdlijnpositie die het media-element als bereikbaar meldtvideo.seekable.end(...)
Live-syncpositieDoor de player gekozen doel achter de edge, inclusief veiligheidsbeleidPlayer-API of expliciete applicatieconfiguratie
Afstand van de afspeelpositiePlaylist- of seekable-edge min de huidige afspeelpositiecurrentTime en de bijbehorende edge op dezelfde tijdlijn
KloklatencyObservatietijd min de geschatte programmatijd bij de afspeelpositieBetrouwbare klok plus consistente programmadatumkoppeling
Glass-to-glass-latencyVan opname bij de bron tot presentatie op het scherm van de kijkerGesynchroniseerde meting bij bron en scherm

Deze waarden kunnen van elkaar verschillen zonder elkaar tegen te spreken. Een player kan slechts twee seconden achterlopen op zijn gecachte playlist, terwijl die playlist zelf ver achterloopt op de actuele oorsprong. Een actuele playlist kan dicht bij de bron zitten, terwijl de kijker tien minuten binnen een DVR-venster heeft gepauzeerd. Een programmadatumtag kan het tijdstip van content aangeven, maar meet op zichzelf niet wanneer de camera een frame heeft opgenomen.

Onderzoek eerst de tijdlijn van de player

Leg alle seekable-bereiken, de huidige afspeeltijd, gebufferde bereiken, duur, afspeelsnelheid en gereedheidsstatus vast. Doe dit vóór en na een klik op Naar live.

function mediaSnapshot(video) {
  const copyRanges = ranges => Array.from(
    { length: ranges.length },
    (_, index) => ({ start: ranges.start(index), end: ranges.end(index) })
  );

  return {
    currentTime: video.currentTime,
    duration: video.duration,
    playbackRate: video.playbackRate,
    seekable: copyRanges(video.seekable),
    buffered: copyRanges(video.buffered),
    readyState: video.readyState,
  };
}

Gebruik duration niet als vervanging voor de actuele live-edge. MDN merkt op dat live media de toegang tot verlopen content kunnen verliezen en dat het instellen van currentTime nog steeds kan eindigen op een aangepaste, ondersteunde positie. Leg bij meerdere bereikbare bereiken alle bereiken vast; ga er niet van uit dat het laatste bereik alle tracks en renditions vertegenwoordigt.

Gebruik voor een aangevraagde positie die al buiten het livevenster valt de diagnose voor HLS-seeks en live-DVR. Begin pas met latencydiagnose nadat de huidige tijdlijn bekend is.

Waarom normaal HLS achter het laatst aangekondigde segment blijft

Een liveclient heeft genoeg beschikbare media nodig om normale variatie in playlistvernieuwing en downloads op te vangen. RFC 8216 adviseert bij de start van normale weergave niet te beginnen met een segment dat minder dan drie target durations voor het einde van een niet-afgesloten playlist start, omdat een start te dicht bij het einde kan vastlopen. Dat is een veiligheidsadvies uit het protocol, geen universele belofte dat elke player exact drie segmenten achter blijft.

Segmentproductie, publicatie van de playlist, verspreiding van origin naar CDN, het tijdstip van playlistvernieuwing, objectdownloads, bufferbeleid, decodering en rendering kunnen elk vertraging toevoegen. Sommige stappen overlappen, andere tellen op. Alleen de startpositie van de player wijzigen verwijdert niet de tijd die al verstreek voordat media in de playlist verscheen.

LaagBewijs dat de laag isoleertVeelvoorkomende verkeerde conclusie
Opname en encodingIngebrande of onafhankelijk waargenomen brontijdEXTINF toont de opnamevertraging
Packaging en publicatieTijdstippen waarop segment/part gereed en de playlist beschikbaar wasCDN-responstijd is gelijk aan packagingtijd
CDN en cacheAge, cachestatus, definitieve URL en herhaalde playlistinhoudHTTP 200 betekent dat de nieuwste playlist is ontvangen
Laden door de playerTiming van playlist- en segmentrequests plus gekozen startDe rand van de voortgangsbalk is de rand van de bron
Buffer en herstelGebufferde bereiken, stalls en wijzigingen in afspeelsnelheidElke extra seconde is een bewuste veiligheidsmarge
Decodering en renderingMedia-events plus meting op apparaatniveaucurrentTime alleen is de glass-to-glass-latency

Meet de eerste laag waarvoor bewijs ontbreekt. Wanneer opeenvolgende playlistrequests langer dan het verwachte updatepatroon dezelfde inhoud teruggeven, onderzoek dan eerst verouderde levering voordat je de player opnieuw afstelt. Onze beslisroute voor verouderde playlists en ontbrekende segmenten helpt die twee gevallen te scheiden.

Bereken twee vertragingen, niet één

De afstand van de afspeelpositie tot de playlist-edge kan zonder klokmetadata worden berekend:

afstand afspeelpositie = einde playlisttijdlijn - huidige afspeelpositie

Dit is bruikbaar voor playerbesturing, maar vertelt niet hoe oud de playlist-edge zelf is. Schat met een consistente EXT-X-PROGRAM-DATE-TIME-koppeling en betrouwbare klokken de tweede component:

leeftijd playlist-edge = observatietijd - programmatijd bij playlist-edge
geschatte kloklatency = leeftijd playlist-edge + afstand afspeelpositie

Onze fixture hield een leeftijd van twee seconden voor de playlist-edge apart van een afstand van 24 seconden tot de afspeelpositie. De som was in de gecontroleerde tijdlijn 26 seconden. Dit zijn testinvoer en -uitvoer, geen metingen van M3U8Online of een productieomroep.

RFC 8216 definieert EXT-X-PROGRAM-DATE-TIME als een koppeling tussen de eerste sample van een segment en een absolute datum en tijd. De specificatie waarschuwt ook dat playlistdatums het productietijdstip van content of een ander, niet aan weergave gerelateerd tijdstip kunnen vertegenwoordigen. Controleer vóór publicatie van een latencycijfer de betekenis van de timestamp, tijdzoneverwerking, kloksynchronisatie en consistentie van de koppeling over varianten en discontinuïteiten.

Laat Naar live naar de syncpositie gaan, niet naar het wiskundige einde

Een robuuste Naar live-actie gebruikt waar mogelijk de gedocumenteerde live-syncpositie van de player. In hls.js is liveSyncPosition de live-edge min de ingestelde veiligheidsmarge. maxLatency beschrijft de drempel waarboven de player vooruit naar die syncpositie kan springen. De player-API is daardoor een betere bron dan een vaste aftrekking die van een andere dienst is overgenomen.

Als het afspeelpad geen live-syncdoel beschikbaar stelt, definieer dan een productspecifiek doel binnen het actuele bereik en valideer dat op ondersteunde apparaten. Stel niet simpelweg currentTime = seekable.end(last) in met de aanname dat het laatst aangekondigde moment al downloadbaar en decodeerbaar is.

De knop moet:

  1. De huidige bereikbare bereiken en playerlatencywaarden vastleggen.
  2. Het gedocumenteerde syncpunt van de player kiezen, of een gevalideerd doel achter het laatste bereikbare einde.
  3. Dat doel tot het actuele bereik begrenzen.
  4. Eén seek aanvragen, zonder tegen de eigen latencycontroller van de player te vechten.
  5. seeking, seeked, de resulterende currentTime en de eerste requests na de actie vastleggen.
  6. De knopstatus pas bijwerken nadat het resultaat bekend is.

In onze deterministische fixture bleef het gekozen doel 12 seconden achter de playlist-edge. De sprong verlaagde de gemodelleerde kloklatency van 26 naar 14 seconden, niet naar nul. Dat is het verwachte gevolg van de veiligheidsmarge van 12 seconden en de edge-leeftijd van twee seconden in deze test.

Leg vast wat het label Live betekent

Een Live-label is een productbeslissing met een vastgelegde tolerantie. Het kan betekenen dat de kijker dicht bij het playerdoel, dicht bij de playlist-edge of dicht bij een betrouwbare programmaklok zit. Dat zijn verschillende beloften.

UI-statusVoorbeeldcriteriumActie voor de gebruiker
LiveAfspeelpositie valt binnen de gevalideerde tolerantie rond de live-syncpositieGeen actie nodig
Achter op liveHuidige positie is geldig maar valt buiten de tolerantieToon Naar live
GepauzeerdWeergave is gepauzeerd, ook als de positie kort geleden live wasBied hervatten en Naar live afzonderlijk aan
Opnieuw verbindenPlayer laadt het doel na een correctie of netwerkherstelToon voortgang; noem dit nog niet Live
Geen betrouwbare klokEdge-afstand is bekend, kloklatency nietToon geen verzonnen exacte vertraging

Voeg een toegankelijk tekstlabel toe en gebruik niet alleen een rode stip. Trek een kijker die bewust in een DVR-venster terugspoelt niet automatisch naar voren, tenzij het product duidelijk weergave met lage latency belooft en dat gedrag uitlegt.

Onderzoek latency die tijdens het afspelen groeit

Wanneer de player dicht bij zijn doel start en steeds verder achterraakt, vergelijk je het begin van die afwijking met deze observaties:

  • Playlistvernieuwingen komen laat, ongewijzigd of uit een onverwacht oude cache terug.
  • De downloadtijd van een segment benadert of overschrijdt de mediaduur.
  • Na rebuffering wordt hervat vanaf een oudere positie in plaats van de live-syncpositie.
  • De afspeelsnelheid blijft onder 1 nadat een inhaalbeleid haar heeft aangepast.
  • Regelmatig laden stopt nadat een mobiele tab of applicatie naar de achtergrond gaat.
  • Een reclameblok, timestampdiscontinuïteit, trackwissel of variantwissel verandert de tijdlijn.
  • Applicatiestatus schrijft herhaaldelijk een oude currentTime terug.
  • De ingestelde maximale latencycorrectie activeert nooit of botst met eigen code.

Leg playlist-, netwerk-, player- en media-elementevents vast op dezelfde monotone tijdlijn. Als de stream herhaaldelijk vastloopt, herstel dan eerst de leveringsfout voordat je de buffer verkleint. De HLS-bufferdiagnose scheidt throughput, segmentbeschikbaarheid, decodering en playerstatus.

Low-Latency HLS is een end-to-endmodus

Low-Latency HLS wordt niet ingeschakeld door een playlist anders te noemen of één queryparameter toe te voegen. Apple beschrijft gedeeltelijke segmenten, server control, blokkerende playlistreloads, preload hints, rendition reports en specifiek server-/CDN-gedrag als samenwerkende onderdelen. De actuele authoringrichtlijnen stellen bovendien voorwaarden aan Part Target Duration en PART-HOLD-BACK.

Valideer encoder of packager, origin, CDN-cachegedrag, playlistresponses, playerondersteuning en terugvalpad gezamenlijk. Een client zonder ondersteuning voor low-latencyfuncties kan een ander requestpatroon volgen. Een CDN dat playlistrequests onjuist buffert of cachet, kan het verwachte voordeel tenietdoen, ook wanneer het manifest low-latencytags bevat.

Publiceer geen latencycijfer op basis van alleen PART-TARGET. Meet werkelijk bron-tot-schermgedrag met gesynchroniseerde klokken en het ondersteunde productiepad. Markeer browsers en apparaten die niet zijn getest als niet getest.

Voer een gecontroleerde testmatrix uit

Leg voor elk ondersteund afspeelpad vast:

  • Native HLS tegenover JavaScript/MSE, waar beide van toepassing zijn.
  • Standaard live tegenover de werkelijke Low-Latency HLS-configuratie.
  • Koude start, normale stabiele weergave, Naar live, pauzeren/hervatten, DVR-terugspoelen en herstel na een stall.
  • Verse originresponse, CDN-hit en een bewust verouderde playlistfixture.
  • Lage en hoge varianten plus alternatieve audio en ondertitels.
  • Herstel vanuit voor- en achtergrond op fysieke mobiele apparaten.
  • Dezelfde toegestane stream op desktop, telefoon, tablet en televisieproducten die officieel worden ondersteund.

Een verkleind desktopvenster is geen test van mobiel achtergrondbeleid of een mobiele decoder. Noteer ontbrekende hardware eerlijk. Houd ondertekende media-URL's en kijkersgegevens buiten schermafbeeldingen en foutrapporten.

Rapporteer een latencybudget met bewijs

Een bruikbaar rapport kan zeggen: “Om 16:00:32 UTC was de nieuwste aangekondigde programmatijd 16:00:30. De afspeelpositie kwam overeen met 16:00:06, zodat de playlist-edge twee seconden oud was en de afspeelpositie 24 seconden achterliep. Naar live vroeg de syncpositie van de player op mediatijd 18 aan en eindigde daar.” Zo zien de eigenaren van packaging, CDN en player welk deel van de vertraging bij hun laag hoort.

Neem klokbronnen en synchronisatie, programmadatumbetekenis, playlistrequest- en cachegegevens, playlist-edge, bereikbare bereiken, huidige positie, instellingen voor live-sync en maximale latency, eerste requests na de correctie, stalls, wijzigingen in afspeelsnelheid en apparaat-/playerversies op. Presenteer geen kloklatency als de timestampkoppeling of klokken niet zijn geverifieerd.

Primaire bronnen

Meet playlist-edge, edge-leeftijd en afstand van de afspeelpositie afzonderlijk. Laat Naar live vervolgens naar een geteste syncpositie springen en niet naar het laatst aangekondigde moment. Zo blijft het veiligheidsbeleid intact, wordt verouderde levering zichtbaar en belooft de interface geen latency die nooit werkelijk is gemeten.