tutorials

如何下载 M3U8/HLS 流媒体:完整入门指南

学习如何在浏览器中下载 M3U8 和 HLS 流媒体,查找播放列表地址、选择 MP4 或 TS、处理跨域和分片问题,并用 FlowPick 完成本地保存。
FlowPick 团队
14 分钟阅读
# m3u8 # hls # 流媒体 # 下载 # 教程

你正在观看一门付费课程,或者一段很想保存的直播回放。右键点击视频——没有"保存"选项。你试了下载工具——结果拿到一个 3KB 的 .ts 文件,VLC 根本打不开。

这就是 HLS 流媒体从用户视角看到的样子。本指南拆解底层原理,并带你一步步把视频完整取出来。

HLS 是什么,为什么存在?

HLS——HTTP Live Streaming——2009 年由苹果创建,最初用于 iPhone 流媒体。核心思路很简单:不传一个巨型视频文件,而是把它切成小块,通过标准 HTTP 逐一传输。

把所有分片串联起来的播放列表文件就是 M3U8 文件——一个扩展名为 .m3u8 的纯文本文件。你在浏览器 Network 面板看到的 .m3u8 URL,是视频的目录,不是视频本身。

典型的 M3U8 长这样:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.960000,
segment_000.ts
#EXTINF:9.960000,
segment_001.ts
...
#EXT-X-ENDLIST

每行 #EXTINF 定义一个分片时长,后面跟该分片的 URL。一小时视频按 10 秒分片就有 360 个 .ts 文件。播放器按顺序下载,用户看起来是连续的流。

自适应码率(ABR)

大多数 HLS 流其实是自适应码率流。不是只有一个 M3U8,而是有一个主 M3U8 列出多个质量版本:

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720
720p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
360p/index.m3u8

播放器根据你的带宽选择合适质量,带宽变化时无缝切换。这就是 YouTube 在网络差时不卡顿的原因——它不是在等一个 4GB 文件下载完,只是在拉接下来 10 秒。

为什么网站偏爱 HLS 而非直链 MP4

分片传输让盗版变得困难得多:

  • 分片 URL 经常过期——2 小时前有效的 URL 现在可能返回 403
  • AES-128 加密可以对每个分片单独加密,密钥轮换
  • 没有单一可下载文件——没什么可以"右键另存为"
  • CDN 分发——实际的 .ts 文件可能分布在全球几十台服务器

对于合法用途(归档、离线学习、无障碍访问),这确实很令人头疼。这就是 HLS 下载工具存在的意义。

不用对的工具会发生什么

假设你在 DevTools 里找到了 M3U8 URL,尝试直接下载:

  • wget/curl M3U8:得到播放列表文本文件,不是视频
  • 浏览器"链接另存为":下载几 KB 的 M3U8 文本,肯定看不了
  • 普通下载工具:要么报错,要么只抓第一个分片
  • youtube-dl/yt-dlp:支持的网站能用,但需要命令行、Python,还要随网站更新不断维护

真正下载 HLS 需要软件能做到:

  1. 解析 M3U8 格式
  2. 相对 URL 转绝对 URL
  3. 下载数百个 .ts 分片(最好并行)
  4. #EXT-X-KEY 里的密钥解密 AES-128 加密分片
  5. 拼接或重封装成可播放的容器格式(MP4 或 TS)

这是一条流水线,不只是简单下载。

用 FlowPick 下载 HLS 流

方式一:浏览器扩展(推荐)

扩展在浏览器里静默监听 M3U8 请求,不需要手动找 URL。

第一步:安装 FlowPick

Chrome 网上应用店Edge 扩展Firefox 附加组件 安装。

第二步:打开页面并按下播放

M3U8 请求只在播放器初始化时发出。只打开页面不够,视频必须开始播放。

第三步:点击 FlowPick 图标

工具栏图标上显示数字角标,表示检测到的流数量。点击打开弹窗。

第四步:选择画质

对于自适应流,FlowPick 读取主 M3U8 并展示所有可用画质,选择你需要的分辨率。

第五步:下载合并

点击 Pick。FlowPick 按设置的线程数(默认2个,可在设置里调高)并行下载分片,本地解密加密分片,合并成 MP4 或 TS 文件(由设置决定)。全程不经过任何服务器,文件直接从 CDN 到你的磁盘。

下载进度

FlowPick 弹窗底部会显示当前下载任务的实时进度:分片下载数/总分片数、当前速度、预计剩余时间。对于几百个分片的长视频,整个过程通常只需几分钟。

方式二:在线工具(无需安装)

已经有 M3U8 URL 的话,直接用 M3U8 在线下载工具 即可,不需要安装扩展。

粘贴 URL、选择画质、点下载。对公开流效果很好,但有些平台有 CORS 限制(这时扩展更有优势,因为它携带页面自己的凭证运行)。

手动找 M3U8 URL 的方法:打开开发者工具(F12)→ Network 标签 → 过滤框输入 m3u8 → 播放视频 → 找 Content-Type 为 application/x-mpegurl 的请求。

输出格式:MP4 还是 TS?

FlowPick 支持两种输出格式,在设置里切换:

MP4TS
兼容性最好,几乎所有播放器都支持部分老播放器不支持
处理速度需要 FFmpeg WASM 重封装,略慢直接二进制拼接,极快
文件大小比 TS 小 5-15%(容器开销更少)略大
适合场景长期保存、上传平台、视频编辑追求速度、后续用 FFmpeg 处理

日常用 MP4 就行。 只有你打算后续用 FFmpeg 命令行做进一步处理,或者网速慢想跳过重封装步骤,才考虑 TS。

加密流:AES-128

很多付费内容使用加密 HLS,M3U8 里有这样一行:

#EXT-X-KEY:METHOD=AES-128,URI="https://api.example.com/key?token=abc123"

意思是:每个 .ts 分片用 128 位 AES 密钥加密,密钥从那个 URI 获取。没有密钥,原始分片字节毫无意义。

FlowPick 自动处理这一切:

  1. 从 URI 获取密钥(使用浏览器的 Cookie 和会话——所以登录状态下可用)
  2. 用浏览器内置 Web Crypto API 在客户端解密每个分片
  3. 密钥和分片数据从不发送到任何外部服务器

FlowPick 无法处理的: Widevine、PlayReady 或 FairPlay DRM。这些是硬件级内容保护,解密密钥绑定到设备,JavaScript 无法访问。Netflix 和 Disney+ 属于这一类。

实际使用场景

在线课程平台(Udemy、Coursera 等)

大多数课程平台用加密 HLS,防止学员下载后退款。FlowPick 能处理 AES-128 加密——前提是你已经登录且有访问权限。

操作节奏:打开课程视频 → 播放 5 秒 → 打开 FlowPick → 选 720P(课程内容清晰度足够,文件更小)→ Pick。下载完立刻播放验证一遍,确保音频同步。

直播回放录制

直播结束后通常有一段短暂的回放窗口(24-72 小时),之后平台删掉或只对付费会员开放。这段时间内下载是最干净的——流是静态的,URL 不像实时直播那样快速过期。

判断方法:如果是实时直播,M3U8 里不会有 #EXT-X-ENDLIST 标签。有这个标签说明直播已结束,是可以完整下载的静态流。

自动字幕内嵌内容

部分平台的 HLS 流包含多语言音轨,M3U8 里用 #EXT-X-MEDIA:TYPE=AUDIO 列出。FlowPick 会检测并展示可用音轨供你选择。

常见问题排查

"检测到 0 个流"

最常见原因:视频还没开始播放。M3U8 请求只在播放器初始化时发出。按下播放,等缓冲一两秒再看。

如果网站把播放器放在 iframe 里(嵌入式播放器、课程平台),需要右键视频 → "在新标签页中打开框架",在那个标签页用 FlowPick。

"下载到 X% 就停了"

流 URL 过期了。大多数平台的分片 URL 有 4-6 小时有效期,直播内容可能只有 30 分钟。

解决:刷新页面,重新播放视频获取新 URL,再用 FlowPick 重新检测。

"下载的文件播不了"

几种可能:

  • 分片损坏:单个损坏的 .ts 会破坏合并。试试低画质版本。
  • 非标准 TS 格式:FlowPick 用 FFmpeg WASM 处理重封装,但边缘情况存在。
  • 音视频不同步:用 VLC 打开,选择"始终修复"(媒体 → 转换/保存 → 配置文件 → 视频编解码器 → 勾选"修复/忽略损坏或缺失的 AV 同步")。

"只下到单个 .ts 文件"

在 Firefox 上或合并步骤静默失败时会这样。切换到 Chrome 或 Edge,合并支持更好——Chrome 的 File System Access API 允许直接写大文件到磁盘。

下载速度很慢

默认并发线程是 2 个,比较保守。在 FlowPick 设置里把线程数调到 4-6,速度通常能有明显提升。注意别调太高——太多并发连接反而可能触发服务端限速。

大文件下载说明

FlowPick 通过浏览器的 File System Access API 做流式写入,理论上没有文件大小限制。4K 视频、几 GB 的长内容都不在话下,不会因为文件大导致浏览器崩溃或内存爆掉。

Chrome 和 Edge 对大文件支持最好(完整的 FSA 流式写入)。Firefox 也支持,但走的是不同的写入策略,超大文件场景稳定性略低于 Chrome。

快速参考:HLS 与另一种格式

如果你遇到的是 .mpd 文件而非 .m3u8,你面对的是 DASH——另一种相关的流媒体协议。详细解析见 什么是 DASH 流媒体?MPD 文件解析

两者都能用 FlowPick 处理,操作流程基本一致,主要区别是 DASH 有独立的音视频轨道需要合并,处理时间略长。


推荐阅读