M3U8 / HLS 下载
HLS 把一整段视频切成很多小分片,逐个下载再拼起来。理解了这一点,绝大多数「卡住」都有解释。
清单长什么样
主清单只列不同码率的子清单,子清单才列真正的分片:
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=2800000,RESOLUTION=1280x720
720p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1400000,RESOLUTION=854x480
480p/index.m3u8子清单里的每一行 .ts(或 .m4s)就是一个分片,#EXT-X-KEY 表示分片被加密。
| 标签 | 含义 | 对下载的影响 |
|---|---|---|
#EXT-X-STREAM-INF | 多码率入口 | 要选一路,工具默认取最高带宽 |
#EXT-X-KEY:METHOD=AES-128 | 分片加密,需要 key 地址 | 有 key 且可获取时可解;否则我们不做绕过 |
#EXT-X-ENDLIST | 点播(已完结) | 可以完整下载 |
没有 ENDLIST | 直播(还在增长) | 清单会不断变长,见 直播录制 |
下载时的三个关键行为
- 并发拉取:默认多分片同时下,不是一条条排队。所以速度取决于站点单连接带宽,而不是分片数。
- 失败重试:单个分片失败会重试;连续失败到阈值才整体报错,日志里能看到是哪个分片、什么状态码。
- 顺序拼接:分片按清单顺序写入,不按下载完成顺序,避免时间轴错乱。
为什么卡在 0.00%
| 现象 | 原因 | 处理 |
|---|---|---|
| 一直 0/0,进度 0.00% | 清单请求就失败了 | 看日志状态码:403 补 Referer;404 地址已过期;超时换网络 |
| 有总分片数但不下 | 分片请求被拒或跨域 | 多数是防盗链,填源地址;仍失败说明需要登录态 |
| 进度涨一阵停住 | 个别分片反复失败 | 等它重试;持续不动就记下日志里的分片序号再排查 |
| 进度 100% 但不落盘 | 卡在转封装 | 分片格式异常或磁盘空间不足;换输出目录重试 |
加密流不要硬试
带
#EXT-X-KEY 且拿不到 key 的流,工具会明确报错。这是内容保护,我们不提供绕过手段,也不写相关教程。TS 转 MP4 是什么
HLS 分片通常是 MPEG-TS,直接改名成 .mp4 多数播放器打不开。下载完成后会把分片按顺序拼起来并重写容器头,输出标准 MP4。这一步是本地计算,不联网,耗时与文件大小相关。
参数与取舍
| 选择 | 好处 | 代价 |
|---|---|---|
| 选最高码率 | 画质最好 | 体积最大、耗时最长 |
| 选中间码率 | 体积与画质平衡 | 细节会糊 |
| 分片并发高 | 总时间短 | 站点可能限流,反而更慢 |
| 先小段试下 | 确认地址可用再下整段 | 多一步操作,但省掉白等半小时 |
先验证再全量
长视频建议先把清单里前几个分片跑通,确认 200 再全量,避免下到 90% 才发现被限流。