手头上有个M3U8链接,想保存成MP4文件慢慢看,这是很多朋友的刚需。FFmpeg是最好用的工具,没有之一。下面我把整个流程写清楚,新手跟着做也不会错。
Windows用户去官网下载编译好的可执行文件,解压后把bin目录加到系统环境变量PATH里。Mac用户用Homebrew最方便,一行命令:
brew install ffmpeg
Linux用户直接用包管理器,比如Ubuntu:
sudo apt update && sudo apt install ffmpeg
装完之后在终端输入ffmpeg,能看到版本信息就说明装好了。
如果你手里是本地M3U8文件,且TS切片都在同一个文件夹里,命令最简单:
ffmpeg -i input.m3u8 -c copy output.mp4
这里的-c copy意思是直接复制音视频流,不做重新编码。速度非常快,而且不会损失画质。我一般都用这个参数,除非遇到编码不兼容才考虑转码。

如果M3U8是在线链接,直接把链接当输入文件:
ffmpeg -i "https://example.com/video/index.m3u8" -c copy output.mp4
注意链接最好加引号,防止里面特殊字符被shell解析错误。FFmpeg会自动下载所有TS切片并合并成MP4。
有些M3U8是加密的,M3U8文件里会有KEY标签,指向一个AES-128密钥文件。FFmpeg会自动下载密钥并解密,你不需要额外操作,只要FFmpeg能访问到密钥的URL就行。
但如果密钥也有防盗链,FFmpeg可能被拒绝。这种就没法直接用简单命令了,需要配合其他工具先拿到解密密钥。
卡住不动: 可能是网络慢,FFmpeg默认超时时间比较短。加个-timeout 60000000参数,单位是微秒,这样它会等久一点。
音画不同步: 少数情况下-c copy会出现这个问题。去掉-c copy,让FFmpeg重新编码,虽然慢一点,但同步问题会解决。
合并中断: 如果TS切片非常多,中途网络断了,可以用-resume参数尝试续传,或者把已下载的部分先保存,下次接着下。
总的来说,FFmpeg转M3U8到MP4是非常成熟的工作流,命令就那一行,遇到问题多试几个参数,基本都能解决。