How to Download m3u8 / HLS Videos on Mac — 3 Ways That Work
.m3u8 file is just a playlist — the video itself is hundreds of small segments. To save it as a normal MP4 on a Mac you need a tool that downloads every segment and merges them: the easiest way is a dedicated app like Vidnip (paste the page link, it finds and merges the stream automatically); the free command-line ways are yt-dlp and ffmpeg. All three are covered below, including how to find the m3u8 URL and fix 403 errors.
What is an m3u8 / HLS stream?
HLS (HTTP Live Streaming) is how most websites deliver video today. Instead of one big file, the server publishes an .m3u8 playlist that lists hundreds of short .ts or .m4s segments, often in several resolutions and with separate audio tracks. That's why you can't just "Save video as…" — your browser never sees a single video file. Downloading HLS means: fetch the playlist → download every segment → decrypt (many streams use AES-128) → merge everything into one playable MP4.
Method 1: Vidnip — paste a link, get an MP4 (easiest)
Vidnip is a native macOS app built exactly for this. You don't need to find the m3u8 URL yourself — it loads the page in a built-in engine and sniffs the stream out, including players loaded by JavaScript and videos inside iframes.
- Copy the address of the page containing the video.
- Paste it into Vidnip — detected videos appear in a list within seconds.
- Click Download. Segments, AES decryption, merging into MP4, and file naming are all automatic.
It also handles the annoying parts for you: Referer/cookie protected CDNs (it reuses the browsing session), resuming interrupted downloads, downloading whole playlists, and sites that need a login (sign in inside its preview window). Free 7-day trial; a one-time US$3.99 license after that.
Method 2: yt-dlp (free, command line)
yt-dlp is the standard open-source downloader. Install it with Homebrew, then point it at either the page URL or the m3u8 URL directly:
brew install yt-dlp ffmpeg
# Easiest: give it the page URL — it extracts the stream on supported sites
yt-dlp "https://example.com/watch/episode-1"
# Or give it the m3u8 URL directly
yt-dlp "https://cdn.example.com/video/master.m3u8"
If the CDN rejects you, add the page as Referer:
yt-dlp --add-headers "Referer: https://example.com/" "https://cdn.example.com/video/master.m3u8"
yt-dlp needs ffmpeg installed to merge HLS segments — install both, as shown above.
Method 3: ffmpeg (free, command line)
If you already have the m3u8 URL, ffmpeg alone can download and merge it without re-encoding:
ffmpeg -i "https://cdn.example.com/video/master.m3u8" -c copy output.mp4
# With a Referer header if the CDN requires it:
ffmpeg -headers "Referer: https://example.com/" -i "https://cdn.example.com/video/master.m3u8" -c copy output.mp4
-c copy means stream copy — no quality loss and it's fast. To get the m3u8 URL in the first place:
- Open the video page in Chrome or Safari and open Developer Tools → Network.
- Type
m3u8in the filter box, then press play on the video. - Copy the URL of the playlist request (prefer
master.m3u8if there are several).
--concurrent-fragments, or Vidnip which parallelizes by default).Which method should you use?
| Vidnip | yt-dlp | ffmpeg | |
|---|---|---|---|
| Finds the stream for you | Yes — automatic sniffing | On supported sites | No — you find the URL |
| Merges video + audio | Automatic | Automatic (needs ffmpeg) | Manual command |
| Referer / cookies / logins | Automatic (built-in browser) | Manual flags | Manual flags |
| Resume interrupted downloads | Yes | Yes | No |
| Interface | Native macOS app | Terminal | Terminal |
| Price | Free trial, then US$3.99 once | Free | Free |
Comfortable in the terminal and only download occasionally? yt-dlp is excellent. Want it to just work every time — including hostile CDNs, logins, and batch downloads — that's what Vidnip is for.
Troubleshooting
How do I find the m3u8 URL of a video?
DevTools → Network → filter "m3u8" → press play → copy the playlist URL. Prefer the master playlist. Vidnip does this automatically, including for streams started by JavaScript inside iframes.
403 Forbidden / download starts then dies
The CDN checks the Referer header and often cookies. Pass the page URL as Referer (see the commands above) or use a tool that captures the real browsing session. If the link contains an expiring token, grab a fresh URL and start promptly.
The result has no sound (or no picture)
Modern HLS ships video and audio as separate renditions. Download from the master playlist so both get selected, then merge (ffmpeg -c copy). yt-dlp and Vidnip merge automatically.
Can I download Netflix / Disney+ / DRM streams?
No. DRM-protected content (Widevine/FairPlay) can't be legitimately downloaded by any of these methods, and circumventing DRM is illegal in most places. Vidnip detects DRM and tells you honestly instead of pretending to download.
Is downloading streaming video legal?
Depends on the content and where you live. Only save videos you have the right to keep — your own uploads, openly licensed media, or where the site's terms allow personal offline use. Don't redistribute.
Skip the terminal — try Vidnip free
Paste a link, get an MP4. Auto-detection, HLS merging, resume, batch downloads — all built in.
macOS 14+ · Apple Silicon · Apple-notarized · English / 中文 / 日本語
One-time US$3.99 after the trial · no subscription