StreamTest

HLS analyzer

Audit an M3U8 master or media playlist, from ladder shape to live-edge drift.

Where to run the fetch
Request headers

For signed URLs and protected origins. In this browser mode, User-Agent, Referer and Cookie cannot be set — browsers forbid it — so use server mode for those.

Fetch through a proxy so the origin never sees our server — and to reach IP-restricted playlists. host:port or http://user:pass@host:port (http proxies).

For DRM streams with a cleartext key. Format kid:key or a 32-character hex key. Used only to play the stream in your browser — the key never leaves this page.

No analysis yet.

Enter a hls playlist url above, or paste the content, to see results here.

What this checks

  • ABR ladder shape: bitrate inversions, oversized gaps, duplicated rungs
  • Segment timing against EXT-X-TARGETDURATION, and duration variance
  • Live window depth, program date-time continuity and live-edge drift
  • Low-latency HLS: PART-TARGET, PART-HOLD-BACK and blocking reload
  • Encryption method, key URIs and EXT-X-VERSION compatibility

How to read the results

  • Start at the grade: it weights live-edge health and ladder shape above cosmetic warnings, so a B with one inversion is a different day from a D with drift.
  • Read the ladder top to bottom. Bitrate must rise with resolution, and a rung that costs more bits for fewer pixels is the one to delete.
  • Check segment duration variance against EXT-X-TARGETDURATION before blaming the CDN: a packager emitting 4.0s and 9.6s segments will stall players on any network.
  • On live playlists, live-edge drift is the number that predicts stalls, because it grows when the packager falls behind rather than when the viewer does.

What it does not do

  • It reads the manifest and segment metadata, not the pictures: a valid ladder can still be encoded badly.
  • Encryption is checked for signalling only. No licence is fetched and no content is decrypted.
  • One run is one moment in a live stream. For drift across hours use a monitor, not repeated manual runs.

Privacy

Results are never shared. Choose “This browser” and the fetch and the analysis both happen on your machine — the URL, any headers you set and the results never reach our servers, which is also how you test a stream on a private network or behind a login. Pasted content is always analysed locally.

Common HLS findings, explained

Every finding links to a write-up on what it means and how to fix it.

Frequently asked questions

What does the HLS analyzer check in a master playlist?
The ABR ladder: bitrate order against resolution, duplicated rungs, oversized gaps between rungs, codec declarations, and whether every variant is reachable.
Can it analyse a live stream, or only video on demand?
Both. On live playlists it also reads the window depth, EXT-X-PROGRAM-DATE-TIME continuity, and how far the last segment sits behind the live edge.
Does it support low-latency HLS?
Yes. It reads PART-TARGET, PART-HOLD-BACK and blocking playlist reload, and flags the combinations that quietly drop a stream back to normal latency.
Why does my playlist pass here but fail on a device?
Device failures are usually codec or DRM support rather than manifest validity. Compare the codec strings listed on this page against the profiles that device accepts.
Is my playlist URL stored?
Choose "This browser" and both the fetch and the analysis run on your machine, so the URL never reaches our servers.