M3U8 Tester: Play and Diagnose Any HLS Stream

Paste an .m3u8 URL. The tester plays it, then tells you what a player hides: where the sound is, how it is encrypted, and why a download fails.

Test an M3U8 stream

Free and open source. Your browser talks to the stream's server directly: the URL is never sent to Vidora.

Tip: in Chrome DevTools, open the Network tab, filter on m3u8, play the video and copy the first request.

Try:

Diagnosis

    An M3U8 tester checks that an HLS playlist loads and plays. This one goes further: it reads the master and media playlists, downloads at most 256 KB of the first segment to see which tracks really exist, tests the AES-128 key, detects DRM, live and on-demand streams, and prints the ffmpeg command that keeps picture and sound together.

    What the tester checks

    A player only tells you whether the video starts. The tester also reads what the player keeps to itself, from the playlists and from the first bytes of a real segment:

    CheckWhat you learn
    Master or media playlistWhether you have the playlist with every quality, or one variant copied from DevTools
    VariantsResolution, bitrate, codecs and frame rate of each quality, and the one a download would use
    Separate audioAn audio track declared with EXT-X-MEDIA:TYPE=AUDIO and its own URI: the most common cause of silent downloads
    Real tracksVideo only, audio only or both, read from the MPEG-TS program table, the fragmented MP4 init segment or raw AAC, MP3 and AC-3
    EncryptionNone, AES-128 (the key URL is fetched and must return 16 bytes), SAMPLE-AES, or DRM
    DRMWidevine, PlayReady and FairPlay keys in the playlist, and CENC-encrypted init segments
    Live or on-demandTotal duration and segment count, Low-Latency HLS, playlists still growing
    Server answersHTTP 403, 404 or 410, a web page returned instead of a playlist, a DASH manifest, an expired signed URL
    OdditiesByte ranges, discontinuities from inserted ads, segments disguised as .jpg or .png

    Why a stream plays but downloads without sound

    Adaptive streams often keep the audio apart from the picture. The master playlist lists the qualities on #EXT-X-STREAM-INF lines and points each of them to an audio group. When that group has its own URI, the video playlist carries pictures only, and the player quietly loads two playlists at once.

    Copy only the video URL into ffmpeg and you get a silent file. The fix is two inputs mapped together:

    ffmpeg -i "video.m3u8" -i "audio.m3u8" -map 0:v:0 -map 1:a:0 -c copy out.mp4

    The tester finds both URLs and prints that command for you. When you paste a single variant, it reads the first segment: if there is no audio track inside, it says so and tells you to go back to the master playlist. Other causes of silent files, such as a muted preview or an audio codec the container cannot hold, are covered in the guide to videos downloaded without sound.

    Reading the result

    AES-128 is not DRM

    AES-128 is the standard encryption of HLS. The playlist names a key URL, and any player allowed to fetch that key can decrypt the segments, ffmpeg included. The tester fetches the key, checks that it is 16 bytes long, and decrypts the start of the first segment to read its tracks. If the key returns 403, the site wants a cookie, a token or a Referer that the request did not carry. The encrypted M3U8 guide walks through those cases.

    Widevine, PlayReady and FairPlay are DRM: the key never leaves a licensed decryption module. The tester names the system and stops there.

    Testing a live stream

    A playlist without #EXT-X-ENDLIST is live. The preview starts near the live edge, and the printed command records from now until you press q, into a .ts file that stays playable even if the recording is cut. A sliding live playlist cannot give back what aired before you started.

    Use it from the command line

    The engine of this page is open source: m3u8-doctor on GitHub, MIT licensed, with no dependencies. In a terminal it is not limited by CORS and it can send the headers a site expects:

    npx m3u8-doctor "https://cdn.example.com/hls/index.m3u8" --referer "https://example.com/watch/42"

    It prints the same diagnosis, quotes the command for bash, zsh or PowerShell, and has a --json mode for scripts. To convert the stream once it is diagnosed, the M3U8 to MP4 guide compares ffmpeg with the other methods.

    Limits worth knowing

    Rather click than type commands?

    Vidora is a Chrome extension that does it in one click. It finds the stream on the page where the video plays, merges separate audio and video into one file, handles AES-128, and refuses DRM.

    Frequently asked questions

    How do I test if an m3u8 link works?
    Paste the .m3u8 URL above and press Test stream. The tester loads the playlist, plays it with hls.js and reports what it found: the variants, whether the audio is separate, the encryption, live or on-demand, and the exact reason when it fails (HTTP 403 or 404, a web page instead of a playlist, a DASH manifest, a blocked key).
    Why does the tester say the stream is blocked by CORS?
    A web page can only read a stream from another site if that site sends an Access-Control-Allow-Origin header, and many video sites only allow their own player. The stream may be fine: run the same test with npx m3u8-doctor, which is not limited by CORS and can send the Referer and cookies, or use the Vidora extension on the page where the video plays.
    Why does my m3u8 play but the downloaded file has no sound?
    Most often the audio is a separate playlist declared with EXT-X-MEDIA TYPE=AUDIO. The player loads both, but a download of the video URL alone gives pictures only. The tester flags it and prints an ffmpeg command with two inputs and -map 0:v:0 -map 1:a:0.
    Is the m3u8 URL sent to your servers?
    No. The page runs in your browser and requests the playlist, the key and up to 256 KB of the first segment directly from the stream's server. Vidora receives nothing about the URL you test.
    Can it test DRM-protected streams?
    It detects Widevine, PlayReady and FairPlay from the playlist keys and from the pssh boxes of fragmented MP4 init segments, then stops. DRM content cannot be saved with ffmpeg, and removing DRM is illegal in most countries.
    Can I test a live m3u8 stream?
    Yes. A playlist without EXT-X-ENDLIST is reported as live, playback starts near the live edge, and the printed command records to a .ts file so it stays playable even if the recording is cut.

    Romain Gouraud, RGC Digital LLC

    Published 2026-10-07. Tested on the public streams above: the printed commands were run with ffmpeg and the files checked with ffprobe (H.264 video and AAC audio in each).