三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

ffmpeg 实战:下载 m3u8 视频并合并为 mp4 的完整方案

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

macOSbrew install ffmpeg
Linuxsudo apt install ffmpeg(Debian/Ubuntu)或sudo dnf install ffmpeg(Fedora)

验证安装:ffmpeg -version

三、获取 m3u8 地址

  1. 浏览器打开视频页并开始播放
  2. 按 F12 打开开发者工具 → Network 标签
  3. 筛选框输入m3u8,刷新页面
  4. 在请求列表中找到.m3u8文件(可能有多个,选带1080p/720p等清晰度标识的那个)
  5. 右键 → 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.mp4

Referer 填视频所在页面的地址。如果还不行,说明需要登录态(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.mp4

5.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:一个命令搞定绝大多数视频网站。

← 返回列表