文章目录
- 一个Go写的M3U8下载器,多线程自动合并,全平台可用
- 三步完成下载
- 8个参数,只一个必填
- 8个平台的预编译二进制
- 两个实际使用中可能遇到的问题
- 适用场景和局限
一个Go写的M3U8下载器,多线程自动合并,全平台可用
M3U8是当前互联网流媒体的主流传输协议。视频被切成若干TS分片,通过M3U8索引文件串联播放。浏览器端观看没问题,但想保存到本地就需要额外处理:拿到M3U8地址、解析分片列表、逐个下载TS文件、处理可能存在的加密、最后合并为一个视频。
llychao/m3u8-downloader 就是做这件事的。一个Go语言写的命令行工具,输入M3U8地址,输出合并后的视频文件。目前在GitHub上有1400多Star。
三步完成下载
工具的工作流程可以分解为三步:
- 解析M3U8文件,提取所有TS分片的URL
- 多线程并发下载TS分片,下载失败时自动重试。如果流是AES加密的,同步解密
- 下载完成后,将所有TS分片合并为一个mp4文件
默认开启24个下载线程,对多数M3U8资源足够。部分服务器会对高并发请求做限流,这种情况下把线程数调低到8或16就能解决。
8个参数,只一个必填
命令行参数设计很克制,一共8个,必填的只有-u(M3U8地址):
-u:M3U8地址,唯一必填参数-o:输出文件名,默认movie,不带后缀-n:下载线程数,默认24-ht:Host拼接策略,v1和v2两种。部分M3U8源的TS路径和索引文件不在同一目录,下载失败时可切换-c:自定义Cookie,用于需要登录态的资源-r:是否清除TS临时文件,默认true-s:是否跳过SSL证书校验,默认不跳过-sp:文件保存的绝对路径,默认当前目录
大多数场景下,命令只有这么长:
./m3u8-downloader -u=http://example.com/index.m3u8不需要了解M3U8协议的细节,不需要手动拼接分片,不需要关心加密解密的实现。
8个平台的预编译二进制
项目Release页面提供了8个平台的预编译版本:
- Windows:386、amd64、arm64
- Linux:386、amd64、arm64
- macOS:amd64(Intel芯片)、arm64(Apple Silicon)
下载后Linux和macOS执行chmod 0755赋予执行权限,Windows直接双击或在PowerShell中运行。不需要安装Go环境,不需要编译。
如果想从源码编译,项目只有一个main文件,go build -o m3u8-downloader一行命令完成。
两个实际使用中可能遇到的问题
第一个是Host路径拼接。M3U8文件里的TS分片路径可能是相对路径,工具默认按"协议加Host加目录路径"(v1模式)拼接完整URL。如果下载失败,可以尝试-ht=v2切换为"协议加Host"模式。两种策略覆盖了常见的M3U8路径结构。
第二个是并发限制。默认24线程在某些网站会触发反爬机制,表现为部分TS分片下载失败或连接被重置。调低-n参数一般就能解决。
适用场景和局限
m3u8-downloader适合需要批量或脚本化下载M3U8视频的场景。命令行工具天然适合自动化,可以写Shell脚本或Python脚本循环调用,处理一批M3U8地址。
它不具备GUI界面,不适合没有命令行使用习惯的用户。也不支持录播平台的管理功能,比如检测主播上下播、定时录制等。如果你的需求是给定M3U8地址下载视频,这个工具覆盖得很好。如果需要直播录制功能,可以考虑专门的直播录制项目。
另外,下载受版权保护的视频内容在多数地区存在法律风险。工具是中立的技术实现,用户需要自行判断下载内容的合规性。
直播录制项目。
另外,下载受版权保护的视频内容在多数地区存在法律风险。工具是中立的技术实现,用户需要自行判断下载内容的合规性。