HLS werkt op thuis-wifi maar niet op openbare wifi: veilig diagnosticeren
Volg een HLS-storing op hotel-, school- of openbare wifi langs playlists, media, autorisatie, captive portals en CORS, zonder beveiliging te verzwakken.
Een HLS-link speelt thuis wel af, maar faalt in een hotel, op school, op kantoor of in een café. Die vergelijking is nuttig, maar bewijst niet dat het openbare netwerk simpelweg “te traag” is. De speler kan naar een inlogpagina zijn omgeleid, een CDN-hostnaam kan worden geblokkeerd, een originbeleid kan de aanvraag weigeren, segmentaanvragen kunnen autorisatie missen of er kan een foutpagina zijn teruggestuurd waar media werd verwacht.
Volg op het getroffen netwerk de feitelijke aanvraagketen: van de masterplaylist naar de mediaplaylist en vervolgens naar initialisatiegegevens, sleutels, segmenten en eventuele aparte audio- of ondertitelplaylists. Vergelijk dezelfde toegestane inhoud op een netwerk waarvan bekend is dat het werkt. Omzeil geen netwerkbeleid, captive portal, certificaatwaarschuwing, geografische beperking of inhoudsautorisatie. Test alleen streams die je bezit of mag onderzoeken. Maak ondertekende URL's, tokens, cookies, IP-adressen en privénamen van hosts onleesbaar voordat je bewijs deelt.
Verificatiemethode — 27 september 2026: We hebben met Node.js 24.12.0 een deterministische fixture met zes synthetische responsketens uitgevoerd. De fixture maakte onderscheid tussen omleidingen, HTTP 403-responsen voor autorisatie of beleid, fouten in een mediaplaylist, HTML-tussenpagina's, ontbrekende CORS-toestemming en een volledig reagerende synthetische keten. Dit controleert uitsluitend de beslisregels van de fixture. We hebben geen hotel- of openbaar wifi-netwerk gebruikt, geen streamingbron benaderd, geen captive portal getest, geen CORS in een browser uitgevoerd en geen media afgespeeld. De fixture staat in scripts/test-hls-network-path-fixture.cjs.
Vergelijk dezelfde stream, niet een snelheidstestscore
HLS-clients halen een playlist op en daarna de mediasegmenten die daarin staan; een masterplaylist kan naar extra playlists en alternatieve varianten verwijzen. De host van het gekozen segment kan verschillen van de host van het eerste manifest. Een algemene snelheidstest laat niet zien of zo'n aanvraag is omgeleid, geweigerd of met het verkeerde inhoudstype is beantwoord.
Houd de vergelijking beheerst:
- Gebruik hetzelfde apparaat, dezelfde browser, spelersversie, stream en afspeelpositie.
- Controleer of de officiële aanmelding of gebruiksvoorwaarden van het openbare netwerk zijn voltooid.
- Leg de fout op openbare wifi vast en probeer daarna dezelfde toegestane test opnieuw op een bekend goed netwerk.
- Vergelijk de categorie van de host, het padtype (playlist, sleutel, initialisatiesegment, mediasegment), status, omleidingen, inhoudstype en timing.
- Noteer de eerste aanvraag die verschilt. Zet geen inloggegevens of volledige ondertekende URL's in een rapport.
Vergelijk zo mogelijk ook het aanvraagpad uit de ingebouwde diagnose van de speler. Native HLS en JavaScript/MSE-spelers tonen mogelijk verschillende details; noteer daarom welke afspeelroute is gebruikt.
Controleer eerst op een captive portal of HTML-respons
Openbare netwerken kunnen vereisen dat je je eerst in een browser aanmeldt, voorwaarden accepteert of een kamernummer/accountcode invoert voordat gewone internettoegang beschikbaar is. Open een normale webpagina en voltooi de officiële aanmeldstap van het netwerk. Voer streaminggegevens niet in op een pagina die niet duidelijk van de netwerkbeheerder is.
Zoek in het aanvraaglogboek naar een omleiding naar een inloghost, een HTML-respons waar een HLS-playlist werd verwacht of een status 200 met daarin toch een portal- of foutpagina. Alleen de status is niet genoeg: controleer de uiteindelijke URL en Content-Type van het manifest en de eerste mislukte media-aanvraag. Een HLS-parser kan een verwarrende parse- of netwerkfout tonen terwijl de ontvangen inhoud eigenlijk HTML is.
Schakel HTTPS-certificaatvalidatie niet uit, installeer geen onbekend certificaat en gebruik geen onveilige URL om onderschepping te “omzeilen”. Krijgt een veilige aanvraag een certificaatfout, stop dan en vraag de netwerkbeheerder of inhoudsprovider om hulp. Voer geen inloggegevens in en speel niet verder af na een vertrouwenswaarschuwing.
Volg alle hostnamen in de playlistketen
Begin bij de exacte manifest-URL die de speler gebruikt en inspecteer alleen playlists waarvoor je toestemming hebt. Relatieve segment-URI's worden opgelost ten opzichte van de URL van de playlist waarin ze staan. Een masterplaylist kan verwijzen naar mediaplaylists op andere hosts; die playlists kunnen op hun beurt aparte hosts voor sleutels, initialisatiegegevens, audio, ondertitels of segmenten gebruiken.
| Aanvraag | Noteer | Waarom dit telt |
|---|---|---|
| Masterplaylist | Respons, uiteindelijke hostcategorie en inhoudstype | De speler kan al falen voordat een variant is gekozen |
| Geselecteerde mediaplaylist | Status en eerste vermelde bron | Het netwerk kan de manifest-host toestaan maar een distributiehost blokkeren |
| Initialisatiesectie of sleutel | Status en autorisatieresultaat | Versleutelde of gefragmenteerde media heeft dit mogelijk nodig voor decodering |
| Eerste mediasegment | Status, overdrachtstijd en responstype | Dit is de eerste concrete media-inhoud, geen bestand voor een snelheidstest |
| Aparte audio-/ondertitelplaylist | Geselecteerd spoor en eerste bron | Een alternatief spoor kan een andere distributieroute gebruiken |
Tunnnel niet om controles heen als een openbaar netwerk een domein of pad blokkeert. Vraag de beheerder of de dienst is toegestaan en welke gedocumenteerde bestemmingen of poorten worden ondersteund. De inhoudsprovider moet mogelijk de distributieconfiguratie herstellen als een playlist-URI naar een onbereikbare of niet-toegestane host verwijst.
Onderscheid bereikbaarheid, autorisatie en CORS
Deze fouten kunnen in de speler op elkaar lijken, maar het bewijs verschilt:
| Bewijs | Waarschijnlijk onderdeel | Veilige vervolgstap |
|---|---|---|
| DNS-lookup of verbinding met een vermelde host mislukt | Naamomzetting, route, firewall of beschikbaarheid van de dienst | Vergelijk die host met het bekende goede netwerk en vraag de beheerder/provider |
| Omleiding naar aanmelden of HTML waar een playlist werd verwacht | Captive portal of tussenpagina | Voltooi de officiële portal en laad de stream opnieuw |
| HTTP 401/403 voor manifest of segmenten | Inloggegevens, verlopen ondertekend verzoek, toegangsrecht of netwerkbeleid | Vernieuw via de normale route van de provider; kopieer autorisatieheaders niet naar elders |
| Manifest werkt maar een latere playlist/segment niet | Gedeeltelijke bestemmingslijst, CDN-pad of aparte autorisatieregel | Bepaal het eerste falende brontype en de hostcategorie |
| Browser meldt CORS terwijl een aanvraag zichtbaar is | Cross-origin-responsrechten voor de JavaScript-afspeelroute | De stream-eigenaar moet de vereiste CORS-headers voor de origin van de speler teruggeven |
| Browser meldt decodeer-/parsefout terwijl de payload HTML is | Portal- of serverfoutpagina die zich voordoet als media | Controleer status, uiteindelijke URL en inhoudstype voordat je codecs onderzoekt |
CORS is geen algemene schakelaar om netwerkblokkades op te heffen. Bij JavaScript fetch() of XMLHttpRequest moet de server de aanvragende origin toestaan; clientcode kan zichzelf die toestemming niet geven. Een native media-element kan een andere browserroute volgen, dus een resultaat in de ene spelermodus bewijst niet dat de andere hetzelfde werkt. Adviseer bij beschermde streams geen no-cors, wildcardheaders met inloggegevens of het uitschakelen van browserbeveiliging.
Interpreteer statuscodes in hun context
- 200 met verwachte playlisttekst: ga door naar de volgende URI; dit bewijst niet dat segmenten bereikbaar zijn.
- 200 met HTML: waarschijnlijk een tussenpagina of serverfout, geen geldige media.
- 301/302/307/308: noteer de bestemming zonder querystrings te publiceren; bepaal of het een officiële portal of provideromleiding is.
- 401/403: maak via de ondersteunde route van de provider onderscheid tussen verlopen/ongeldige autorisatie en netwerkbeleid. Publiceer nooit tokens of sessieheaders.
- 404: controleer de opgeloste relatieve URI en of de inhoud nog bestaat. Een ander netwerk kan een verouderd of regiogebonden eindpunt blootleggen; raad geen vervangende URL.
- 429/5xx of time-out: noteer de timing en herhaal alleen binnen een redelijke testperiode. Herhaald proberen kan de belasting verhogen en bewijst niet dat een firewall verantwoordelijk is.
De eerste mislukte aanvraag is meestal informatiever dan de laatste algemene foutmelding van de speler. Bewaar alleen een geredigeerde HAR als het netwerk en de organisatie dit toestaan. HAR-bestanden kunnen inloggegevens en persoonsgegevens bevatten; controleer en schoon ze op voordat je ze deelt.
Gebruik een minimale testmatrix
Vergelijk bij een toegestane stream telkens één variabele:
| Netwerk | Browser/spelerroute | Wat dit helpt onderscheiden |
|---|---|---|
| Thuis-wifi | Dezelfde browser en speler | Bekende goede nulmeting |
| Openbare wifi vóór aanmelden bij portal | Dezelfde browser | Portalvereiste of aanvankelijk beperkte toegang |
| Openbare wifi na officiële aanmelding | Dezelfde browser | Of gewone webtoegang beschikbaar is |
| Mobiele data, indien toegestaan | Hetzelfde apparaat en dezelfde speler | Of de storing specifiek is voor dat wifi-pad |
| Tweede ondersteunde spelermodus op openbare wifi | Native HLS versus JavaScript/MSE, indien beschikbaar | Verschil in CORS/spelerroute, geen omzeiling van netwerkautorisatie |
Voer geen tests uit die het gebruiksbeleid van een organisatie schenden. Een school- of bedrijfsnetwerk kan streaming bewust blokkeren. Gebruik dan een toegestaan netwerk of vraag de beheerder; vermom het verkeer niet.
Rapporteer de grens van het bewijs, niet een gok
Een bruikbaar rapport zegt bijvoorbeeld: “Op de toegestane testlink antwoordde de masterplaylist op beide netwerken met status 200 en een HLS-inhoudstype. Op openbare wifi antwoordde de geselecteerde mediaplaylist met 200, maar kreeg de eerste segmentaanvraag 403; de speler gebruikte JavaScript/MSE. Datzelfde segment werkte op het bekende goede netwerk. URL's en headers zijn geredigeerd. Dit wijst op een verschil in autorisatie of netwerkbeleid, maar identificeert niet welke partij de aanvraag weigerde.”
Vermeld apparaat-, browser- en spelersversies, netwerktype, exacte aanvraagfase, status en responstype, categorie van de omleidingsbestemming, timing, gekozen variant/spoor en of de fout reproduceerbaar was. Noem platforms die niet fysiek zijn getest documentatiebeoordeeld of niet getest.
Primaire bronnen
- RFC 8216: HTTP Live Streaming
- MDN: Cross-Origin Resource Sharing (CORS)
- MDN: de Fetch API gebruiken
- MDN: CORS-fout door ontbrekende
Access-Control-Allow-Origin - MDN: same-originbeleid
Zoek eerst de aanvraag die tussen de netwerken als eerste verschilt en bepaal daarna of het een playlist, sleutel, initialisatieobject, segment of alternatief spoor is. Dat bewijs maakt onderscheid tussen portal-, route-, distributie-, autorisatie- en cross-originproblemen in de browser, zonder de beveiliging te verzwakken of de verkeerde laag de schuld te geven.