一、很多同学好奇 M3U8 怎么下载保存成本地 MP4
日常开发、测试的时候,有时候需要把一份 HLS 点播 M3U8 下载到本地,合并成 MP4 文件,方便离线复现 BUG,留存测试样本。很多新手网上搜教程,会遇到各种各样坑:下载之后合并出来花屏、没有声音、加密流下载之后无法播放、直播流不能直接下载合并。
首先分清:点播 M3U8 可以下载 TS 分片合并 MP4;正在运行的直播 HLS 流,不适合下载合并完整视频,直播分片会不断过期删除。AES‑128 加密的 M3U8,就算把所有 TS 分片全部下载到本地,没有密钥,分片依旧无法解码播放。
很多新手网上随便找的在线 M3U8 下载网站,大量有广告、有访问限制,业务测试不建议依赖第三方在线下载网页,优先本地 ffmpeg 做下载合并。
调试下载合并相关问题的时候,我会使用 m3u8live.cn,先确认这条点播 M3U8 在浏览器环境播放正常,再做本地下载合并操作。
二、下载合并 M3U8 高频踩坑
坑 1:拿直播 M3U8 试图下载完整 MP4
直播 M3U8 旧分片会被服务器清理,只能拿到最近一小段分片,无法下载整场直播完整视频。如果需要直播存档,应该在推流阶段就保存完整点播文件,而不是后期下载 M3U8。
坑 2:AES‑128 加密点播流,直接下载 TS 分片
现象:所有 TS 分片全部下载到本地,但是合并出来视频花屏或者完全无法播放。 根因:分片是加密的,没有拿到合法密钥,TS 二进制分片本身无法解码。加密流下载合并必须同时获取密钥。
坑 3:直接简单二进制 cat 拼接 TS 分片
简单把全部 ts 文件二进制顺序 cat 拼接,很多时候可以播放,但是遇到分片时间戳错乱、编码不规范的样本,合并出来花屏、音画不同步。
不推荐 cat 直接拼接,优先使用 ffmpeg 内部处理,会重新做时间戳修复。
坑 4:带时效 token 的 M3U8,下载脚本复用旧 token
下载耗时比较久,下载还没结束,URL 里面 token 已经过期,后半部分 TS 分片全部 403,合并出来的 MP4 残缺不全。
坑 5:Master 主索引直接拿来做下载输入
把多码率 Master 主索引直接丢给下载工具,下载工具不会自动选择子码率,下载失败。需要填写实际的子媒体 M3U8 地址,不是 Master 主索引。
三、FFmpeg 简单下载合并点播 M3U8 参考命令
ffmpeg -i "https://xxx/vod/index.m3u8" -c copy output.mp4说明:‑c copy 直接拷贝音视频流,不重新转码,速度快。前提是点播流非加密,token 有效期足够覆盖下载时长。
注意事项:
- 输入地址不能填 Master 主索引,填写实际子媒体 M3U8;
- 带时效 token 的流,确认 token 过期时间大于下载消耗时间;
- AES‑128 加密流,ffmpeg 下载需要可以访问密钥接口;
- 该命令适合点播,不适合正在运行的直播流。
四、开发测试场景使用建议
- 测试留存样本:优先点播流,先确认浏览器网页播放正常,再做下载合并。
- 加密 M3U8:没有合法密钥,就算下载全部 TS 分片,也不能得到可播放 MP4。
- 不要尝试下载直播流来获取完整录像,直播分片会过期删除,推流阶段就要做好存档。
- 不要使用 cat 简单二进制拼接 TS 分片,优先 ffmpeg 工具处理,自动修复时间戳。
- Master 多码率索引,下载的时候传入具体清晰度的子 M3U8 地址。
五、排查简单步骤
第一步,待测点播 M3U8 粘贴网页调试工具,确认浏览器网页播放正常,区分是点播还是直播,确认是否 AES‑128 加密。 第二步,如果是直播,放弃下载合并完整视频思路,改为推流端存档。 第三步,非加密点播,使用 ffmpeg 命令下载合并,不要简单 cat 二进制拼接 TS 分片。 第四步,带 token 的流,评估 token 有效期,防止下载中途鉴权过期。
六、总结
点播 HLS 可以使用 ffmpeg 把 M3U8 下载合并成本地 MP4,直播流分片会过期删除,不适合后期下载合并完整录像。AES‑128 加密流,没有密钥就算下载 TS 分片也无法解码。不要简单二进制 cat 拼接 TS 分片,容易出现花屏音画不同步。Master 多码率主索引不能直接作为下载输入,需要传入子媒体 M3U8。借助网页调试工具,先确认点播流网页播放正常,再执行本地下载合并,规避下载合并过程中的各类坑点。