M3U8Grab:免费 M3U8/HLS 流下载器(Windows/macOS/Linux 三端)

把一整条 m3u8 流——每一个清晰度、每一条音频轨、每一条字幕——下载到一个完全自洽的本地文件夹。配套 ZWServe,一条命令起的本地 CORS 服务器,无需额外配置即可把结果丢进任何支持 HLS 的播放器(如 ZWPlayer)播放。

下载(预编译,免安装):

M3U8Grab(下载器):

ZWServe(本地播放服务器):

免费 · 开源单文件 · 无广告 · 免登录 · 全程不上传


痛点:m3u8 流没法直接另存为

现在主流视频网站都用 HLS 方式分发内容——一个 .m3u8 播放列表,背后指向成百上千个 .ts 小分片。播放器边看边拉。这对在线观看很好,但带来几个问题:

  • 你没法"右键 → 保存"把视频存下来。
  • 源一旦下线,视频就永远没了。
  • 没法离线观看、归档,也没法按自己的节奏学习字幕内容。
  • 普通下载工具往往只抓单个清晰度,还悄悄丢掉了字幕轨和音频轨。

M3U8Grab 解决这个问题。它把整棵 HLS 树完整镜像下来——master 播放列表、每个码率变体、每条音频轨、每条字幕轨、每个解密密钥——然后把所有引用改写成本地路径。最终得到一个不再依赖原始服务器的自洽文件夹;用配套的 ZWServe 在本地起一个服务,就能在任何支持 HLS 的播放器里播放。

M3U8Grab 如何处理分片与加密流(m3u8 抓取原理)

给它一个 master .m3u8 地址,它会:

  1. 发现 所有被引用的播放列表(变体、音频、字幕)并下载。
  2. 改写 每一个 URI="..." 和分片引用为本地相对路径(相对 该播放列表自身所在目录,保证引用不错位)。
  3. 并发下载 全部分片/密钥/字幕,最后告诉你应该打开哪个文件来播放。

输出完全自洽——每个引用都指向本地文件,不再依赖原始服务器。播放时用 ZWServe(见下文)通过 HTTP 把这个文件夹提供出来,再把 master 播放列表地址粘进播放器即可,无需连接原始源站。

加密 m3u8 也能下载? 没问题。M3U8Grab 会跟随 #EXT-X-KEY 标签,下载流所引用的解密密钥,所以即使是加密的(非 DRM 的 AES-128)HLS 流也能完整抓取——只要你对源站有合法的访问权限,密钥会和分片一起下载下来,结果可离线播放。

核心特性

特性 说明
完整镜像 master + 全部码率 + 全部音频轨 + 全部字幕轨 + 密钥,一个都不丢。
可离线播放 所有引用改写为本地路径,文件夹完全自洽。
跨域支持 不受浏览器 CORS 限制,资源即使与 master 不同 host 也能抓取(映射到 external/<host>/...)。
断点续传 重跑时自动跳过已存在且非空的文件,只补缺。
原子写入 每个分片先写到 .part 临时文件,完整后才改名,杜绝半截文件。
失败重试 单文件最多 5 次重试,指数退避(0.5s/1s/1.5s/2s/2.5s)。
高并发 默认 16 个 worker,可用 -workers 调整。
零依赖 预编译二进制自包含,无需任何运行时环境——下载即用。
文件名清洗 自动剔除 Windows 非法字符,同一文件夹在三大平台都能用。

三端使用说明

先下载对应系统的二进制,然后:

Windows

双击不弹交互界面,请在保存 .exe 的目录里打开 PowerShell命令提示符

# 下载到一个名为 myvideo 的文件夹
.\m3u8grab-win.exe -url "https://example.com/vod/master.m3u8" -out "myvideo"

macOS(Apple Silicon)

chmod +x m3u8grab-macos
./m3u8grab-macos -url "https://example.com/vod/master.m3u8" -out "myvideo"

首次运行 macOS 可能拦截未签名二进制。右键 → 打开 → 确认;或先执行一次 xattr -d com.apple.quarantine m3u8grab-macos

Linux

chmod +x m3u8grab-linux
./m3u8grab-linux -url "https://example.com/vod/master.m3u8" -out "myvideo"

命令行参数

参数 默认值 说明
-url (必填) master m3u8 地址(支持 http/https,支持跨域引用)
-out (必填) 本地输出目录(不存在会自动创建)
-workers 16 并发下载数
-force false 强制重新下载,忽略已存在的本地文件
-insecure false 跳过 TLS 证书校验(仅用于自签名 / 内网 CDN)
-h 显示使用说明

常用示例

# 自定义地址 + 输出目录,并提高并发
./m3u8grab-win.exe -url "https://.../master.m3u8" -out "media/v" -workers 32

# 中断后继续——直接重跑即可,已下载的分片会自动跳过
./m3u8grab-win.exe -url "https://.../master.m3u8" -out "media/v"

# 强制全量重新下载
./m3u8grab-win.exe -url "https://.../master.m3u8" -out "media/v" -force

# 自签名证书的内网流
./m3u8grab-win.exe -url "https://internal-cdn/master.m3u8" -out "media/v" -insecure

输出目录结构

运行后会得到一个镜像了整条流的文件夹:

myvideo/
├── master.m3u8            ← 播放入口,打开这个
├── manifest0/             ← 视频 270p  (index.m3u8 + index*.ts)
├── manifest1/             ← 视频 360p
├── manifest2/             ← 视频 480p
├── manifest3/             ← 视频 720p
├── manifest4/             ← 视频 1080p
├── manifest5/             ← 音频 64k Main
├── manifest6/             ← 音频 128k Main
├── manifest9/             ← 字幕 en  (captions.en.m3u8 + *.webvtt)
├── manifest10/            ← 字幕 sv
└── external/<host>/...    ← 跨域资源(如有)

跨 host 的资源会落到 external/<host>/...,其播放列表引用也会改写为指向该本地路径。

播放:用 ZWServe 起服务 + ZWPlayer 打开

你已经下载了一个完整、自洽的 HLS 文件夹。怎么看? 分两步:先用 ZWServe 通过 HTTP 把文件夹提供出来,再把地址粘进 ZWPlayer 这款免费、免安装的在线播放器。

为什么需要服务器?HLS 播放器(如 ZWPlayer)通过 fetch/XHR 拉取 m3u8 播放列表和 .ts 分片,用 file:// 协议直接打开根本不工作;而且在线播放器跑在 zwplayer.com 域,访问你本机的内容属于跨域请求,必须服务器显式返回 CORS 头才放行。ZWServe 两件事都办了:既通过 HTTP 提供文件,又对每个响应注入宽松的 CORS 头。

1. 用 ZWServe 起本地服务

下载对应平台的 ZWServe(链接见顶部),然后在刚才运行 M3U8Grab 的目录里:

# Windows(PowerShell)—— 以当前目录为根,默认监听 8000
.\zwserv-win.exe

# 指定端口
.\zwserv-win.exe -port 9000

# macOS / Linux
chmod +x zwserv-macos && ./zwserv-macos
chmod +x zwserv-linux && ./zwserv-linux

# 指定要服务的目录
.\zwserv-win.exe -port 8000 -dir ./media/myvideo

启动时会打印所有本地网卡的可粘贴地址,例如:

ZWServe — from zwplayer.com (local CORS web server)
-------------------------------------------------
ZWServe — minimal CORS local web server
---------------------------------------------------------
serving : /home/me/media/ed_hd
port    : 8000
cache   : off (no-store — every refresh fetches the latest)

Serving at:
  http://192.168.1.20:8000/
  http://localhost:8000/

Tip: serving m3u8? Append your path, e.g. http://localhost:8000/master.m3u8

复制那条以 /master.m3u8 结尾的链接——这就是你的播放地址。

ZWServe 参数:

参数 默认值 说明
-port 8000 监听的 TCP 端口
-dir . 要服务的目录(默认:当前目录)

2. 把链接粘进 ZWPlayer 播放

打开 ZWPlayer,把 http://localhost:8000/master.m3u8 这个地址粘进播放器的 URL 输入框。因为 ZWServe 返回了 CORS 头,在线播放器就能跨域访问你本机的文件夹——而文件都在你机器上,全程不上传给第三方。

ZWPlayer 原生支持 HLS(m3u8)、DASH、MP4、MKV、MOV、WebM 等格式,M3U8Grab 产出的内容它都能播。

3. 内嵌字幕自动加载

这正是 M3U8Grab 要"改写引用"而不是保留原始 URL 的关键原因:m3u8 里的字幕轨现在指向本地 .webvtt 文件。当你在 ZWPlayer 中打开这个文件夹时:

  • 流里包含的每一种字幕语言(en、sv、ru、ja、ar……)都会自动挂载为可选择的字幕轨。
  • 在播放器的字幕菜单里切换即可,无需手动加载文件。
  • 因为字幕在本地,所以离线时也能用。

4. 预加载外部字幕与翻译

想要流里没有的字幕,或者要翻译?

  • 预加载外部字幕:播放时加载你自己的 VTT / SRT / BCC / JSON 字幕文件,支持多轨同时加载,方便双语对照。
  • 字幕翻译:内置面板支持实时把字幕翻译成 13 种语言,作为副字幕叠加显示——无需提前制作翻译好的文件。
  • 字幕搜索:跨全部字幕行搜索,命中即跳转,并支持逐句循环播放,非常适合语言学习。

🛠️ 想可视化地制作或精修字幕?试试免费的在线字幕编辑器——时间轴对齐、导出 VTT/SRT,成果可直接载入播放器。

进一步:接入 WordPress

如果你在 WordPress 站点发布视频,ZWPlayer WordPress 插件把以上全部能力——多字幕、翻译、播放列表、防盗播水印、章节——封装成古腾堡区块或简码,零代码集成。

常见问题

这样下载合法吗?

请只下载你有权访问的内容(自有媒体、已授权内容、或明确公开的流)。M3U8Grab 是一个工具;尊重版权与服务条款是你的责任。

为什么需要 ZWServe?不能直接打开 m3u8 文件吗?

不能。HLS 播放器是通过 HTTP(fetch/XHR)加载播放列表和分片的,file:// 地址下根本无法工作。而且播放器跑在网页上(如 zwplayer.com),访问你本机属于跨域请求,需要 CORS 头才放行。ZWServe 就是一个零配置的服务器,两件事都办了:既通过 HTTP 提供文件,又对每个响应注入宽松的 CORS 头。

会转成 MP4 吗?

不会——它保留原始 HLS 结构(分片 + 播放列表),这样才能完整保留所有码率、音频轨和字幕。用 ZWServe 起服务后,任何支持 HLS 的播放器(如 ZWPlayer)都能直接播放。如果你确实需要单个 MP4 文件,那是另外的封装/转码步骤。

下载中断了,要重来吗?

不用。原命令重跑即可。已下载、非空的文件会被跳过,只补缺失的部分。

某个清晰度失败了,能只重试它吗?

能——同上,重跑就会补齐缺失项。

被杀毒软件 / macOS 拦截了。

因为这些二进制没有签名,部分系统会拦截。macOS:右键 → 打开 → 确认,或执行 xattr -d com.apple.quarantine <文件>;Windows:在 SmartScreen 里点"更多信息" → “仍要运行”。

总结

M3U8Grab 把脆弱的、只能在线看的 m3u8,变成一个永久、自洽的本地文件夹——保留每一个清晰度、每一条音频轨和字幕。ZWServe 再用一条命令把这个文件夹暴露成一个带 CORS 的本地地址,直接粘进 ZWPlayer 就能播放,自动挂载多语言字幕,外加翻译与搜索能力。两者搭配,也是开发者测试 HLS 流和 CORS 行为的理想测试床。

下载你那个系统的二进制,找一条你有权保存的流,现在就试试。

M3U8Grab(下载器):🪟 Windows · 🍎 macOS · 🐧 Linux

ZWServe(播放服务器):🪟 Windows · 🍎 macOS · 🐧 Linux