To convert M3U8 to MP4 online, paste the playlist URL above, press Check link, choose the quality and press Convert to MP4. The page downloads every segment from the stream's server, decrypts AES-128 if needed, and writes one MP4 without re-encoding, so the quality is the original. A separate audio playlist is merged in, and MP3 / audio only saves just the sound. When the browser cannot do it, it prints the ffmpeg command instead.
How to convert M3U8 to MP4 online
- Copy the .m3u8 URL. In Chrome, open DevTools, go to the Network tab, filter on
m3u8and play the video. The first request is usually the master playlist, the one that lists every quality. The guide to finding the m3u8 URL covers the tricky cases. - Paste it and press Check link. The page reads the playlists and the first bytes of a segment, the same diagnosis as the M3U8 tester: where the sound is, how the stream is encrypted, live or on-demand.
- Pick the quality. The best quality up to 1080p is selected, with AAC sound preferred when two variants have the same resolution, because AAC plays everywhere once in MP4.
- Press Convert to MP4. In Chrome and Edge on a computer, you choose where to save and the file is written to disk as it downloads. In other browsers the file is assembled in memory, then downloaded.
Four segments download at a time, a request that fails on the network or with a server error is retried once, and Cancel stops everything.
What happens to the stream
| What the playlist contains | What the converter does |
|---|---|
MPEG-TS segments (.ts), H.264 video and AAC sound | Remuxes them to MP4 with mux.js: same video and audio data, new container, no re-encoding |
Fragmented MP4 segments (EXT-X-MAP, .m4s) | Writes the init segment once, then every fragment in order |
Byte ranges (EXT-X-BYTERANGE) | Requests each slice of the file with a Range header |
| AES-128 encryption | Fetches the key, decrypts each whole segment with WebCrypto, follows key changes |
Separate audio playlist (EXT-X-MEDIA:TYPE=AUDIO) | Downloads the video and the audio playlist you pick, then writes both tracks into one MP4, lined up on the stream's own timestamps |
| MP3 / audio only | Saves the sound alone: AAC as .m4a, MP3 as .mp3, AC-3 as .ac3, copied without re-encoding |
| HEVC, AC-3 or MP3 inside MPEG-TS, SAMPLE-AES | For an MP4, stops and prints the ffmpeg command. MP3 and AC-3 sound can still be saved alone |
| Live stream, DRM | Stops. Live gets a recording command, DRM gets nothing |
The result is a fragmented MP4: it plays in browsers, VLC, mpv and most players. If a video editor refuses it, rewrite it as a regular MP4 without re-encoding:
ffmpeg -i video.mp4 -c copy -movflags +faststart video-regular.mp4
When the browser cannot do it: the ffmpeg command
ffmpeg reads HLS natively and is not limited by CORS. After the check, the page prints the exact command for the stream you checked, quoted for bash or PowerShell, with a yt-dlp alternative. Two cases come up most often when the server blocks the page:
Separate audio playlist
ffmpeg -i "https://cdn.example.com/hls/video/1080p.m3u8" -i "https://cdn.example.com/hls/audio/en.m3u8" -map 0:v:0 -map 1:a:0 -c copy video.mp4
Live stream
ffmpeg -i "https://cdn.example.com/live/index.m3u8" -c copy recording.ts
Press q to stop. A .ts file stays playable even if the recording is cut, and you can remux it afterwards in the TS to MP4 converter or with ffmpeg -i recording.ts -c copy recording.mp4. More in the guide to recording a live m3u8.
On AES-128 streams, ffmpeg fetches the key itself and decrypts on the fly, so the same commands work. Passing a Referer and cookies, fixing a file without sound and the other ways to convert are covered in the M3U8 to MP4 guide.
Separate audio tracks
Many streams keep the sound apart from the picture. The master playlist declares it on an #EXT-X-MEDIA:TYPE=AUDIO line with its own URI, and the video playlists carry pictures only. A player loads both at once; a converter that only follows the video playlist writes a silent MP4.
This page follows both. After the check, an Audio menu lists the sound tracks of the chosen quality by name and language, with the one marked DEFAULT=YES selected. On Convert, the video and audio segments download side by side, each is remuxed without re-encoding, and the two tracks go into one MP4. The picture and the sound keep the start times the stream gives them, so the sync is the same as in the player.
- Encryption. AES-128 is decrypted on both playlists, each with its own key and IV.
- Formats. MPEG-TS, raw AAC segments (
.aac) and fragmented MP4 are all read. When the segments are MPEG-TS or raw audio, the sound must be AAC; fragmented MP4 sound is copied whatever its codec. Raw AAC segments are merged only when each one starts with its ID3 timestamp, as the HLS specification requires: without it the sound cannot be lined up with the picture, and the page says so (saving the sound alone still works). - Spliced streams. At each
EXT-X-DISCONTINUITY, both tracks restart together after the previous part. The two playlists must be spliced at the same places, as the HLS specification requires.
The ffmpeg command with two inputs and -map 0:v:0 -map 1:a:0 stays available for streams the browser cannot read. If a file you already downloaded has no sound, the guide to videos downloaded without sound lists the other causes.
M3U8 to MP3: save only the audio
Press Check link, then choose MP3 / audio only above the Convert button. When the stream has separate sound tracks, the Audio menu lists all of them; the page saves the one you pick, without the picture. Nothing is re-encoded, so the file type follows the sound inside the stream:
| Sound in the stream | File you get |
|---|---|
| AAC, the most common | .m4a, the AAC frames copied into an MP4 audio container |
MP3 (MPEG-TS or raw .mp3 segments) | .mp3, the MP3 frames as they are |
| AC-3 or E-AC-3 | .ac3 or .eac3, played by VLC and mpv |
Sound carried in fragmented MP4 segments stays in an MP4 container: .m4a for AAC or MP3, .mp4 for other codecs. When the sound is inside the video segments rather than in its own playlist, the page has to download the picture too, then leaves it out. Pick a low quality first: the sound is often the same in every quality, and the download is smaller.
Turning AAC into a real MP3 means decoding and encoding the sound again, which this page does not do. With the audio only option selected, the command box prints it for the track you picked:
ffmpeg -i "https://cdn.example.com/hls/audio/en.m3u8" -vn -c:a libmp3lame -q:a 2 audio.mp3
-q:a 2 is LAME's variable bitrate around 190 kb/s, transparent for most listening. With yt-dlp: yt-dlp -x --audio-format mp3 followed by the playlist URL.
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. The converter fetches each key once, checks that it is 16 bytes long, and decrypts every segment with the initialization vector the HLS specification defines (the IV attribute, or the segment's sequence number). Segments before the first key stay as they are, and a key change midway is followed.
Widevine, PlayReady and FairPlay are DRM: the key never leaves a licensed decryption module, and removing DRM is illegal in most countries. The converter names the system and stops. SAMPLE-AES, which encrypts inside the video frames, is not converted either; the encrypted M3U8 guide covers what ffmpeg can do with it.
Limits
- CORS. A page can only read a stream whose server allows it. Many video sites allow only their own player: the converter then says it could not read the stream, which says nothing about the stream itself.
- Referer and cookies. Browsers do not let a page set the Referer or cookies of its requests. Streams that need them work with ffmpeg or from the page where the video plays.
- Memory. Chrome and Edge on a computer write to disk as the segments arrive. Other browsers keep the file in memory until the end: the page warns when the file should pass about 500 MB and stops at 1 GB (300 MB on phones).
- Live and DRM. A live playlist has no end to convert, and DRM is refused. Both are explained above.
- Codecs. MPEG-TS streams must be H.264 with AAC sound, and a separate audio playlist in MPEG-TS or raw audio must be AAC to be merged. Fragmented MP4 streams are copied whatever their codecs. The page never re-encodes, so it does not turn AAC into MP3.
- Discontinuities. Streams spliced with ads restart their timestamps at each
EXT-X-DISCONTINUITY. In MPEG-TS streams, the converter places each part after the previous one. If a part changes the picture size, the H.264 profile or level, or the sound settings, one MP4 cannot hold both: the page stops and the ffmpeg command takes over. A spliced fragmented MP4 stream with its sound in the same playlist goes straight to the ffmpeg command; with a separate audio playlist, its parts are lined up like MPEG-TS parts, as long as the init segment keeps the same settings.