m3u8文件/TS视频的下载方案演进介绍
m3u8/TS 视频下载方案演进介绍
在线视频早已成为互联网流量的主力。从早期的 FLV、RMVB 到今天的 MP4,视频格式不断进化。但在直播、点播场景中,传统的单一文件传输方式无法满足自适应码率、实时切换、断点续播等需求。于是,m3u8 格式应运而生。
什么是 m3u8?
m3u8 本质是一个索引文件(playlist),它是 Apple 公司推出的 HLS(HTTP Live Streaming)协议的核心组成部分。HLS 协议将一整段视频切割成无数个小的 TS 片段,并通过 m3u8 文件告诉客户端这些片段的顺序、时长、加密信息以及可选的多种码率版本。
m3u8 解决了什么问题?
- 自适应码率:根据用户网络状况自动切换清晰度(480p → 720p → 1080p)
- 分段传输:将大视频切成小片段,加载快、可缓存、可局部更新
- 直播支持:持续追加新的 TS 片段,播放器只需轮询 m3u8 文件即可实现低延迟直播
- 加密防盗链:通过 #EXT-X-KEY 字段指定 AES 加密密钥,保护视频内容
m3u8 文件特点与解析
m3u8 文件是纯文本格式(UTF-8 编码),以 # 开头的标签为控制指令。下面是一个典型的单码率 m3u8 文件:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
segment0.ts
#EXTINF:10.0,
segment1.ts
#EXTINF:10.0,
segment2.ts
#EXT-X-ENDLIST各行含义如下:
- #EXTM3U:文件头,标识这是 m3u8 格式
- #EXT-X-VERSION:HLS 协议版本号
- #EXT-X-TARGETDURATION:每个 TS 片段的最大时长(秒)
- #EXT-X-MEDIA-SEQUENCE:序列号起始值
- #EXTINF:后面 TS 片段的时长,单位秒
- segment0.ts:实际的视频片段文件路径(相对/绝对 URL)
- #EXT-X-ENDLIST:播放列表结束(若无此行则为直播流)
多码率 m3u8(Master Playlist)
大型视频平台通常会提供多种清晰度。主 m3u8 文件会列出各码率的子播放列表:
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
360p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1500000,RESOLUTION=854x480
480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3000000,RESOLUTION=1280x720
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=6000000,RESOLUTION=1920x1080
1080p.m3u8播放器会根据当前带宽和屏幕分辨率自动选择合适的子流。若视频有 AES 加密,m3u8 中还会出现 #EXT-X-KEY:METHOD=AES-128,URI="key.key" 字段,指定解密密钥的获取地址。
什么是 TS 文件?
TS(Transport Stream,传输流)是 MPEG-2 标准定义的一种容器格式,扩展名为 .ts。与 MP4 不同,TS 被设计用于传输而非存储,具有以下特点:
- 固定包长(188 字节),即使数据丢失也能快速恢复同步
- 支持拼接——任意两个 TS 片段可以直接合并,不会损坏
- 容错性强——丢包不会影响整个视频,只损失对应片段
- HLS 选择 TS 而非 MP4 的原因:MP4 的 moov atom 在文件头/尾,对拼接和实时流不友好
如何获取视频的 m3u8 文件?
浏览器 DevTools 是获取 m3u8 地址最直接的方式:
- 打开 Chrome/Firefox,按 F12 进入开发者工具
- 切换到 Network(网络)标签页
- 在过滤栏输入
.m3u8 - 刷新页面或播放视频,观察出现的 .m3u8 请求
- 右键 → Copy → Copy URL 获取完整地址
此外,也可以使用 Chrome 插件来嗅探页面中的 m3u8 流。FlowGet 自带一个 Chrome 插件,当页面检测到 m3u8 资源时自动弹出提示,一键传给 FlowGet 客户端下载。
m3u8 下载方案演进
阶段一:浏览器直接下载
最原始的方式。打开 DevTools 找到所有 .ts 片段 URL,手动逐个下载,再用 FFmpeg 拼接:
cat segment0.ts segment1.ts ... > all.ts
ffmpeg -i all.ts -c copy output.mp4一段 10 分钟的 1080p 视频可能有 300~600 个 TS 片段,逐个下载几乎不可行。这种方式仅适用于几个片段的极短场景。
阶段二:FFmpeg 原生下载
FFmpeg 原生支持 m3u8 读取,一句命令即可完成下载和合并:
# 最简单的方式:直接下载为 mp4
ffmpeg -i "https://example.com/video.m3u8" -c copy output.mp4
# 指定 User-Agent 绕过简单反爬
ffmpeg -headers "User-Agent: Mozilla/5.0" \
-i "https://example.com/video.m3u8" \
-c copy output.mp4
# 选择特定码率
ffmpeg -i "https://example.com/master.m3u8" \
-map 0:v:2 -map 0:a:2 -c copy 720p.mp4优点:免费、跨平台、一条命令搞定。
缺点:不支持 AES 自动解密(需手动下载 key 文件)、不支持多线程下载(速度受限)、对加密/反爬/动态 token 的网站支持有限。
阶段三:Internet Download Manager(IDM)
IDM 是一款老牌下载工具,能捕获浏览器中的视频流并自动弹出下载提示。
- 优点:图形界面、操作简单、多线程下载、能捕获大部分网页视频
- 缺点:并非专门为 m3u8 设计,遇到 AES 加密、动态 token 或非标准 HLS 时经常失效;闭源付费;仅 Windows 平台
IDM 适合普通用户快速下载常规视频,但对复杂场景越来越力不从心。
阶段四:FlowGet — 一站式 m3u8 下载工具
FlowGet 是开源的跨平台 HLS/m3u8 下载器,它针对 m3u8 下载做了全方位优化:
核心特性
- 跨平台桌面应用:Windows / macOS / Linux 全支持
- 多线程并发下载:大幅提升下载速度,支持断点续传
- 自动 AES 解密:支持 AES-128/192/256-CBC,无需手动寻找 key
- 格式检测:自动识别被伪装成 PNG/JPG/BMP 的 TS 片段并还原
- Master Playlist 解析:自动列出所有码率供选择,也可选全部下载
- 代理支持:支持带认证的 HTTP 代理,即时生效无需重启
- 自定义请求头:灵活应对反爬机制和防盗链
- REST API 接口:可通过编程方式控制下载,语言无关
- Chrome 插件配套:浏览器嗅探到 m3u8 资源时自动弹出,一键发送到 FlowGet 客户端
- FFmpeg 自动集成:打包发布时自动附带 FFmpeg,无需用户额外安装
FlowGet 的工作流程:
- 用户打开视频页面 → Chrome 插件嗅探到 m3u8 链接
- 插件通过 REST API 将链接推送到 FlowGet 客户端
- FlowGet 解析 m3u8,列出所有码率和片段
- 用户选择清晰度,点击下载
- FlowGet 多线程并发下载 TS 片段 + 自动解密 → 合并为完整 MP4
相比方案一至三,FlowGet 将嗅探、下载、解密、合并集成为一个闭环,用户只需在浏览器中点一下鼠标。
总结
从浏览器手动逐段下载到 FFmpeg 命令行,再到 IDM 图形化工具,最终到 FlowGet 这样的一站式解决方案,m3u8 下载工具的发展脉络清晰可见:越来越自动化、越来越跨平台、越来越专注于 HLS 协议的深度支持。
如果你只是偶尔下载一两个视频,FFmpeg 够用。如果你频繁处理 m3u8 视频、遇到加密或反爬场景,FlowGet 会是更省心的选择。
本文系作者 @Mr.Lee 原创发布在 维简网。未经许可,禁止转载。