ffmpeg 实战:下载 m3u8 视频并合并为 mp4 的完整方案
适用场景:网页视频没有下载按钮,用开发者工具抓到 m3u8 播放列表,需要下载并合并为完整 mp4。
前置工具:ffmpeg(开源免费,下文有安装方法)。全文以 Windows 为主,macOS/Linux 命令同理。
一、先搞清楚 m3u8 是什么
m3u8 是 HLS(HTTP Live Streaming)协议的播放列表文件。网站为了播放流畅,把一段视频切成几十上百个几秒钟的.ts小片段,m3u8 就是记录这些片段顺序的"目录"。播放器照着目录逐个播放,用户看到的就是完整视频。
所以下载 m3u8 视频的本质是:按目录把全部 .ts 片段下载下来,再顺序拼接。而 ffmpeg 一条命令就能完成这个过程。
二、安装 ffmpeg
Windows(任选其一):
winget install ffmpeg(Win10/11 自带 winget)- 或去 ffmpeg.org 下载 release 版本,解压后把
bin目录加入系统 PATH
macOS:brew install ffmpeg
Linux:sudo apt install ffmpeg(Debian/Ubuntu)或sudo dnf install ffmpeg(Fedora)
验证安装:ffmpeg -version
三、获取 m3u8 地址
- 浏览器打开视频页并开始播放
- 按 F12 打开开发者工具 → Network 标签
- 筛选框输入
m3u8,刷新页面 - 在请求列表中找到
.m3u8文件(可能有多个,选带1080p/720p等清晰度标识的那个) - 右键 → Copy → Copy link address
四、下载并合并(核心命令)
ffmpeg-i"https://example.com/playlist.m3u8"-ccopy output.mp4-i:输入文件(m3u8 地址)-c copy:直接复制音视频流,不重新编码,速度极快且无损output.mp4:输出文件名
跑完当前目录下就会出现完整的 mp4。
五、常见问题与解决
5.1 报 403 Forbidden(防盗链)
很多网站校验 Referer 和 User-Agent,ffmpeg 默认不带这些头。手动加上:
ffmpeg-headers"Referer: https://example.com"-user_agent"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"-i"https://example.com/playlist.m3u8"-ccopy output.mp4Referer 填视频所在页面的地址。如果还不行,说明需要登录态(Cookie),见 5.4。
5.2 下载到一半中断
HLS 下载是顺序进行的,中断后重新执行同一条命令即可,不会破坏已下载的内容(ffmpeg 会从头重新下载,所以尽量保证网络稳定)。
5.3 合并出来没有声音
- 检查你抓的 m3u8 是否只是视频流:有些网站音视频分离,F12 里可能有两条 m3u8(一个 .m3u8 纯视频、一个 .m3u8 纯音频)。
- 解决办法:抓音视频合流的那条 m3u8(通常文件名带
av/all/mixed),或者用-map 0指定全部流:
ffmpeg-i"..."-map0-ccopy output.mp45.4 需要登录的视频(仅限自己账号有权访问的内容)
如果你已登录该网站、且账号本身有权限观看这个视频,可以复用浏览器的登录态来下载。ffmpeg 通过-headers手动带上 Cookie(先打开 F12 → Network 里复制请求头的 Cookie 值):
ffmpeg-headers"Referer: https://example.com"-headers"Cookie: session_id=xxxx; vip=1"-i"https://example.com/playlist.m3u8"-ccopy output.mp4更省事的方案是用 yt-dlp(见本系列另一篇),它支持
--cookies-from-browser直接读取浏览器登录态。
⚠️ 只允许用自己的账号下载自己有权访问的内容;不要借用他人登录态,更不要用它去拿会员/付费专享内容。
5.5 指定清晰度
HLS 的清晰度选择有两种情况:
- 抓到的是主播放列表(里面嵌套多个清晰度子列表):把主列表里的某个清晰度子列表地址拿出来作为
-i输入 - 或者直接在主列表后面加参数指定(需要该站点支持):
ffmpeg-i"https://example.com/master.m3u8"-ccopy-bsf:aaac_adtstoasc-fmp4 output.mp4六、批量下载:一个 for 循环
把链接放进urls.txt,每行一个:
whilereadurl;doffmpeg-y-i"$url"-ccopy"$(basename$url .m3u8).mp4"done<urls.txt七、写在最后
- 以上方法仅适用于自己有权访问的内容(免费公开、已购买、平台允许下载的资源)。
- 付费课程、会员专享、受 DRM 保护的视频,不要尝试绕过——既违法也违背技术人的底线。
- ffmpeg 下载合并属于"保存已有内容",不涉及破解,放心用。
下一篇讲 yt-dlp:一个命令搞定绝大多数视频网站。
