什么是 HLS 协议?
HTTP Live Streaming(HLS)是苹果公司于 2009 年提出的自适应比特率流媒体协议,基于标准 HTTP 传输,目前已成为互联网视频分发的主流标准。Netflix、YouTube、爱奇艺等平台均使用 HLS 分发视频。
HLS 的工作原理分三步:① 服务器将视频切割成 2-10 秒的小片段(.ts 文件);② 生成一个 M3U8 播放列表文件,记录所有片段的地址;③ 播放器读取 M3U8,按顺序下载片段播放,并根据网速切换画质。
M3U8 文件有哪两种类型?
理解 M3U8,首先要区分两种文件:
- 主播放列表(Master Playlist):列出所有可用的画质档位,每一行对应一个分辨率/码率的媒体播放列表地址
- 媒体播放列表(Media Playlist):列出某一特定画质下,所有 .ts 片段的实际地址
播放器拿到 M3U8 后,先解析主播放列表,选定一个码率,再去取对应的媒体播放列表,开始下载片段。
主播放列表示例
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
360p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720
720p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p/index.m3u8
媒体播放列表示例
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.009,
https://cdn.example.com/seg000.ts
#EXTINF:9.009,
https://cdn.example.com/seg001.ts
#EXT-X-ENDLIST
关键标签含义速查
| 标签 | 含义 |
|---|---|
#EXTM3U | 文件头标识,必须存在于第一行 |
#EXT-X-VERSION | HLS 协议版本号,影响可用特性 |
#EXT-X-TARGETDURATION | 所有片段中最长的时长(秒),播放器据此设置超时 |
#EXT-X-MEDIA-SEQUENCE | 当前列表中第一个片段的序号(直播用) |
#EXTINF | 下一个片段的精确时长 |
#EXT-X-KEY | 加密信息,指定 AES-128 密钥地址 |
#EXT-X-ENDLIST | 播放列表结束标志,有此标签为点播,无则为直播 |
#EXT-X-STREAM-INF | 主播放列表专用,声明下一行媒体列表的码率和分辨率 |
自适应码率(ABR)工作机制
ABR 是 HLS 最核心的特性。播放器内部维护一个带宽估算器,根据最近几个片段的下载速度计算可用带宽,与主播放列表中各档位的 BANDWIDTH 值对比,自动选择最合适的码率。
切换时机:当连续 3 个片段的下载速度低于当前码率的 1.5 倍时,播放器会切换到更低档位;反之当带宽充裕时,会逐步提升画质。整个过程用户无感知,播放不中断。
HLS 与其他流媒体协议对比
| 协议 | 延迟 | CDN 友好 | 浏览器支持 | 适用场景 |
|---|---|---|---|---|
| HLS / M3U8 | 8-30s | ✓ 原生支持 | 全平台 | 点播、大规模直播 |
| RTMP | 1-3s | ✗ 需专用服务器 | 需插件 | 推流端到服务器 |
| DASH | 8-30s | ✓ 原生支持 | 较好 | 点播(Netflix等) |
| WebRTC | <1s | ✗ 难以缓存 | 现代浏览器 | 实时互动(视频通话) |
想直接体验 HLS 播放,访问 StreamFlow 在线播放器,粘贴任意 M3U8 链接即可播放,无需安装任何软件。
- 直播流没有
#EXT-X-ENDLIST,播放器需要不断轮询刷新列表,不要误以为是文件损坏 - M3U8 中的片段地址可以是相对路径,解析时必须以 M3U8 文件所在目录为基准拼接完整 URL
- 遇到 CORS 错误时不是播放器问题,是服务器缺少
Access-Control-Allow-Origin响应头 - 主播放列表的
BANDWIDTH是峰值码率,不是平均码率,设置偏高会导致频繁降级 - 加密的 M3U8(含
#EXT-X-KEY)必须同时能访问到密钥 URL,否则无法解密播放