Short answer: an .m3u8 file is not a video. It is a text playlist describing where the real media lives — a sequence of short segments. To get one MP4 you download the segments in order and remux them into a container, keeping the original encoding rather than re-compressing. That last part is what preserves quality and keeps the job fast.
What HLS actually is
HTTP Live Streaming, originally built by Apple and now documented as RFC 8216, slices video into many short chunks and publishes a playlist that lists them. A media player reads the playlist, fetches segments as needed, and switches between quality levels without interrupting playback.
Two playlist types matter:
- Media playlist — the segment list for one quality level, ending in
.m3u8. - Master playlist — an index pointing at several media playlists, one per rendition (for example 360p, 720p, 1080p). It contains
EXT-X-STREAM-INFlines rather than segments.
This is why “save video as…” has nothing to grab: the browser is not downloading a file, it is following a playlist. The behaviour is specified and predictable — see also how players feed decoded chunks through Media Source Extensions.
Why the naive approaches fail
| What you tried | What you got | Why |
|---|---|---|
| Right-click → Save video as | Nothing, or a tiny playlist file | The context menu targets a media element; HLS is delivered as a stream of segments, not one address |
| Copy the video URL into an online downloader | Error, or a 12-second fragment | Segment URLs are often signed and session-bound, so they expire or reject a foreign client |
Download all the .ts files manually | A folder of unusable fragments | They are correct fragments — they were never merged, and the audio may live in a separate rendition |
| Re-encode everything from scratch | Slow, larger, softer output | Re-encoding discards the original encoding; remuxing keeps it |
From playlist to one MP4
Get the real playlist address
Analyze the page that plays the video and look for a resource ending in .m3u8. If several appear, the larger set usually belongs to the master playlist. Capture the page address if the playlist is signed per-request — replaying a stale playlist is the most common single cause of failure.
Decide which rendition to keep
Open the master playlist and read the variant list. Pick the highest rendition your use case needs. Keep in mind that the best rendition is worth choosing deliberately: after download, upgrading means downloading again.
Fetch and remux — do not re-encode
Remuxing copies the existing video and audio streams into a new container. FFmpeg’s official documentation covers the distinction; in practice the difference shows up as speed and file quality. A stream that arrives as separate audio and video renditions must have both tracks selected, or you will get silence.
Choose MP4 or MKV
MP4 is the most portable container and plays almost everywhere. MKV is more forgiving when a stream carries unusual subtitle or track layouts. If you are unsure, MP4 is the default to reach for.
Verify the result before deleting anything
Play the finished file through to the end and check that audio and video stay in sync. Only then clear the temporary segments. A file that opens but is truncated at the end usually means the playlist finished before the last segments were fetched.
Troubleshooting the usual failures
“HTTP 403” or “401” partway through
The segment request was rejected. Segment URLs are commonly signed with an expiry. If the download ran longer than the signature lifetime, restart it rather than resuming; a session-aware tool that reuses your login can refresh the authorization mid-job.
The MP4 has no audio
Audio and video were separate renditions and only one was merged. Re-run the merge with both tracks selected.
The output is a folder of .ts files
Segments were fetched but never remuxed. That is a completed step one and an absent step three — add the merge rather than re-downloading.
Audio drifts out of sync near the end
Usually a sign that segments from two different rendition sets were combined, or that timestamps were rewritten. Re-derive both tracks from the same variant before merging.
Where this stops
Encrypted-media delivery — DRM — is a different mechanism from HLS segment encryption, and it is out of scope here. If the player only ever hands the decoder protected frames, there is no playlist to fetch and no remux to perform.
How VidBrowser handles HLS and DASH
VidBrowser is a free desktop app for macOS and Windows. Analyze the page and it lists every video resource that page loads — direct files, HLS playlists, DASH manifests, and player segments — so you are choosing from what the page really requested rather than guessing at an address.
- Probe and remux: manifest streams are probed and merged with FFmpeg into MP4 or MKV.
- Best rendition kept: adaptive sources keep their highest available quality rather than a fixed default.
- Direct files stay simple: if the page serves a real MP4 or WebM, it downloads as it is served — no remux needed.
- Extractor fallback: sites that drive playback through their own extractor get a dedicated yt-dlp pass.
- Visible progress: the queue tracks progress, speed, and transferred bytes so you can see where a long HLS job is.
Everything runs on your machine, so the playlist and segment requests come from your own session instead of a remote service.
Turn a playlist into a file
Free for macOS and Windows. Analyze the page, pick the rendition, and get one clean MP4 or MKV on disk.
Download VidBrowser freeFrequently asked questions
What is an m3u8 file?
It is a text playlist used by HTTP Live Streaming. Rather than containing video, it lists the addresses of short media segments and the order in which to play them. A master playlist lists several such playlists, one per quality level.
Why can’t I save an HLS video by right-clicking?
There is no single media file behind the player to save. The browser is fetching many short segments described by a playlist, so the context menu has nothing to target. The video has to be captured at the resource level and then merged.
Should I convert HLS to MP4 or MKV?
MP4 for maximum compatibility across players, phones, and editors. MKV when the stream carries track layouts that MP4 handles awkwardly. Both are containers, so converting between them by remuxing is fast and lossless.
Does remuxing reduce quality?
No. Remuxing copies the existing encoded streams into a new container without decoding and re-compressing them. Quality is lost when you re-encode, which is a separate and slower operation.
Why did my download stop with a 403 error?
Segment addresses are usually signed with an expiry time. If the job outlived the signature, the remaining requests are rejected. Restart the download, ideally from a tool that can refresh authorization from your own session.
