m3u8d:扔掉ffmpeg,一个Go写的m3u8下载工具
m3u8d:扔掉ffmpeg,一个Go写的m3u8下载工具
m3u8d 在 GitHub 上拿到了 991 Star。
这个工具解决了一个具体问题:下载 m3u8 视频不需要装 ffmpeg。纯 Go 实现 ts 到 mp4 的转换,二进制体积从 30MB+ 压到 5-7MB,跨平台编译也不再是门槛。

1、 为什么会有人写这个
做过 m3u8 下载的人都知道那个绕不开的依赖:ffmpeg。
ffmpeg 好用,但引入它的代价不小。GPL 协议有传染性,如果项目代码跟 ffmpeg 链接,整个项目就得按 GPL 发布。编译方面,cgo 调用要配跨平台编译链,直接内嵌静态二进制的话,每个平台版本比现在大 25MB。OpenWRT 路由器上甚至找不到静态编译的 ffmpeg。
更麻烦的是用户体验。让用户先装 ffmpeg 再装你的工具,门槛翻倍。m3u8d 用 gomedia 替代了 ffmpeg,gomedia 是纯 Go 的媒体处理库,MIT 协议,命令行版本只有 5-7MB。
2、 支持哪些平台
Windows 有 Qt 图形界面,Mac 和 Linux 提供命令行版本,Mac 也有图形界面。Linux 额外支持 arm、386、mipsle 架构,OpenWRT 路由器上也能跑。

3、 curl 模式:解决鉴权
这是 m3u8d 区别于同类工具的一个设计。
很多视频网站的 m3u8 链接需要带着 Cookie、Referer、Authorization 等 Header 才能访问。传统做法是手动提取 Header 然后逐个填进配置。
m3u8d 直接支持 curl 命令。在 Chrome 开发者工具里找到 m3u8 请求,右键"复制为 cURL",粘贴进去,工具自己从 curl 命令里解析出 URL、Header 和 Cookie。
./m3u8d curl 'https://example.com/index.m3u8' -H 'cookie: CONSENT=YES'
4、 下载合并一条龙
常规用法:
# 单个下载
./m3u8d download -u https://example.com/index.m3u8
# 批量下载
./m3u8d batch -i urls.txt -d ./downloads
# 合并已有 ts 文件
./m3u8d merge --InputTsDir /root/save --OutputMp4Name save.mp4
下载过程中每个 m3u8 对应一个 downloading 子目录,ts 片段按来源分开存放。下载完成后自动合并成 mp4。批量下载的 urls.txt 支持给每个链接指定输出文件名,格式是 URL 空格后跟文件名。
5、 实用细节
AES 加密的 m3u8 能处理,同一个 m3u8 里不同 ts 用不同加密策略也支持。嵌套 m3u8 自动解析。给了一个网页地址,工具会先下载 html 从里面搜 m3u8 链接。
合并时如果发现后续 ts 文件的分辨率或帧率跟第一个不一致,跳过不合并,避免生成的 mp4 无法播放。支持 http 和 socks5 代理。可以按编号范围跳过某些 ts,也可以按服务器返回的 HTTP 状态码跳过(如 403、404)。
6、 技术选型的代价
用 gomedia 替代 ffmpeg 有 tradeoff。gomedia 的功能覆盖不如 ffmpeg 全面,但就 ts 转 mp4 这一项来说,够用。
换来的好处很明确:MIT 协议,编译链简单,二进制小,用户不用装额外依赖。对于 m3u8 下载这个场景,这个取舍是合理的。
浙公网安备 33010602011771号