How-to · 5 min read · Last updated: 2026-10-31

How to Download M3U8 Video to MP4: 4 Ways That Work (2026)

Last checked:
On this page

An .m3u8 file contains the playlist for an HLS stream, so saving the link alone gives you text rather than a playable video. To make an MP4, a tool needs to download the video segments listed in that playlist and join them. This guide covers four methods: ffmpeg, VLC, an online downloader and a browser extension.

The quick answer

Quick answer: an .m3u8 file is a playlist of short video segments, not the video. To save it, use a tool that fetches every segment and joins them into one MP4.
  • You have the .m3u8 URL and a computer: run ffmpeg -i "URL" -c copy video.mp4 (Method 1), or use VLC's Convert menu (Method 2).
  • You can't install anything: an online m3u8 downloader may work for short, public, unsigned playlists (Method 3).
  • The video is playing in Chrome: an extension that detects HLS saves it without hunting for the URL (Method 4).
MethodInstall needed?Takes a raw URL?Encrypted (AES-128) streamsWorks onCost
ffmpeg (Method 1)Yes, a command-line toolYesYes, when the key URL is reachableWindows, Mac, LinuxFree
VLC (Method 2)Yes, a desktop appYesPartly; encrypted or signed streams fail more oftenWindows, Mac, LinuxFree
Online m3u8 downloaders (Method 3)NoYesVaries by siteAny browser, including phonesFree with ads; size or time caps
Clipmoth Chrome extension (Method 4), our toolYes, a Chrome extensionNo; it works from the page playing the videoYesChrome on Windows, Mac, Linux; not YouTubeFree 10/day · $9.99 one-time

What an .m3u8 is, and how to find the URL

HLS (HTTP Live Streaming) splits a video into hundreds of short .ts or .m4s segments. The .m3u8 is a plain-text list of them, plus a pointer to the AES-128 key if the stream is encrypted. A line starting #EXT-X-STREAM-INF marks a master playlist that points to several qualities. To find the URL:

  1. Play the video on the page.
  2. Press F12 (Cmd+Option+I on a Mac) and open the Network tab.
  3. Type m3u8 in the filter box. Reload if the list is empty.
  4. Right-click the request → Copy → Copy link address. The first, shortest one is usually the master playlist.

A long token in the query string means the URL is signed and will expire, so use it soon. If you see .mpd instead, the site uses DASH (see the FAQ).

Official options and terms

Check the site first. Vimeo lets uploaders turn on a Download button, and many course platforms offer offline viewing in their apps. If the stream is yours, download the original from your hosting dashboard (Vimeo, Wistia, Mux); it beats reassembled segments.

The rules: HLS is used by thousands of unrelated sites, so there is no single set of terms. Most sites allow access only through their own player, and breaching their terms can get an account suspended even when no copyright is infringed. Your own streams, Creative Commons material and streams you have permission to save are fine. We are not lawyers; this is not legal advice.

Terms and law in detail

Course platforms in particular enforce their terms. Read the terms of the site you are on before saving anything from it.

  • Saving someone else's copyrighted stream without permission can infringe their rights, whatever tool you used.
  • Japan, for example, makes it an offense to download content you know was uploaded without the rights holder's permission.
  • Circumventing DRM is prohibited separately under the US DMCA and the EU Copyright Directive, even for content you may otherwise copy. None of our tools attempt it.

Tools and their limitations

Clipmoth is our own product; weigh that as you read.

Method 1: ffmpeg (plus yt-dlp)

Install ffmpeg (on a Mac, brew install ffmpeg), then run:

ffmpeg -i "https://example.com/stream.m3u8" -c copy video.mp4

-c copy remuxes without re-encoding, so it is fast and loses no quality. AES-128 is handled when the key URL is reachable.

Given a master playlist, ffmpeg picks one variant on its own, usually but not always the highest; to be sure, pass the URL of the variant you want, or use yt-dlp.

If the server answers 403, send the headers your browser sent:

ffmpeg -headers "Referer: https://example.com/" -user_agent "Mozilla/5.0" -i "https://example.com/stream.m3u8" -c copy video.mp4

yt-dlp also takes an .m3u8, picks the best quality from a master playlist and retries failed segments: yt-dlp "https://example.com/master.m3u8" -o video.mp4 (add --referer if needed; it needs ffmpeg too).

If you end up with separate video and audio files, merge them without re-encoding:

ffmpeg -i video.mp4 -i audio.m4a -c copy out.mp4

Method 2: VLC

  1. Choose Media → Open Network Stream (File → Open Network on a Mac) and paste the URL.
  2. Open the arrow next to Play and choose Convert (on a Mac, tick Stream output).
  3. Pick Video - H.264 + MP3 (MP4), set a file name ending in .mp4, and click Start.

The default profile re-encodes; tick “Keep original video track” and “Keep original audio track” in the profile to avoid that. VLC fails more often than ffmpeg on signed or referer-locked URLs.

Method 3: Online m3u8 downloaders

They need no install, but the URL goes to their server, so signed, IP-bound or referer-locked streams fail, and free tiers cap length and carry ads. We have not tested any of them and do not name one.

Method 4: The Clipmoth Chrome extension

The Clipmoth extension detects the HLS or DASH stream the page is playing and saves one MP4, but it cannot take a bare URL, does not record live streams, and does not work on YouTube (see our compatibility guide). Try it on our practice pages first:

For video playing in the browser, including sites yt-dlp does not list, this is how yt-dlp and our Chrome extension differ.

yt-dlp (command line)Clipmoth Chrome extension
CoverageSites on its list (1,000+)Any HLS / DASH stream that is playing, whatever the site (not YouTube)
URLYou pass the video page URLNothing to find: it detects what is playing
Pages behind a loginExport cookies and pass themNot needed; it runs inside your logged-in browser
Encrypted streams (AES-128)YesYes, and nothing is uploaded
CostFree, unlimitedFree 10/day · $9.99 one-time (one key with the Windows app)

When it doesn't work

ProblemWhat to do
The stream is still liveThere is no end to download. ffmpeg records from now on (add -t 01:00:00 to stop after an hour); wait for the replay for the whole thing.
DRM (Netflix, Prime Video, Disney+)Widevine, PlayReady or FairPlay keys are never exposed, so no tool here can save these. Plain AES-128 is different: its key URL sits in the playlist.
403 ForbiddenCopy a fresh URL (signed links expire), send the Referer header, or use a local tool if the URL is bound to your IP.
Silent or video-only fileYou copied a video-only child playlist. Give ffmpeg or yt-dlp the master playlist so it fetches both tracks.
You saved a text fileThat is the playlist itself (it starts with #EXTM3U). Run the URL through one of the methods above.

Frequently asked questions

How do I open or play an .m3u8 file?

Use VLC (Media → Open Network Stream), or Safari and QuickTime Player (File → Open Location), which play HLS natively; Chrome, Edge and Firefox do not. A saved .m3u8 opened from disk usually won't play, because its segment URLs are relative to the original server.

How do I convert m3u8 to MP4 on a Mac or iPhone?

On a Mac, all four methods work. On an iPhone, the free a-Shell terminal app ships ffmpeg and runs the same one-line command; otherwise convert on a computer and move the MP4 over with AirDrop.

Can I download an m3u8 online without installing anything?

Sometimes, for short public streams. Many online tools read only the first variant of a master playlist, or hand back a raw .ts file instead of an MP4.

What about DASH (.mpd) streams?

DASH uses a .mpd manifest with .m4s segments, and ffmpeg -i "URL.mpd" -c copy video.mp4 works for unencrypted DASH. yt-dlp accepts .mpd links too and merges the separate audio and video tracks DASH usually uses.

Save an HLS stream in one click

Clipmoth is our own downloader. Its Chrome extension saves an HLS or DASH stream as a single video file, including streams with AES-128 encryption. You do not need to find the stream URL, and your video is not uploaded to a server.

The extension does not support YouTube. Our Windows app supports YouTube, TikTok and over 1,000 sites.

Both offer 10 free downloads a day. Premium costs a one-time $9.99, with a 14-day refund policy.

Add to Chrome (free) Windows app for YouTube & 1,000+ sites

See what Premium adds