一、HLS 的工作方式#
HLS 不是"实时推流协议",而是"把直播切成小文件,让客户端通过 HTTP 下载播放"。
推流端:
编码器 → 切片器 → TS 文件 1 (2秒)
→ TS 文件 2 (2秒)
→ TS 文件 3 (2秒)
→ m3u8 播放列表(不断更新)
播放器:
先请求 m3u8 → 看到 TS 文件列表 → 依次下载并播放
二、m3u8 文件格式#
#EXTM3U ← 标识这是 HLS 播放列表
#EXT-X-VERSION:3 ← 版本
#EXT-X-TARGETDURATION:10 ← 每个切片最长 10 秒
#EXT-X-MEDIA-SEQUENCE:100 ← 起始序列号
#EXTINF:8.320, ← 第一个切片时长 8.32 秒
segment-100.ts
#EXTINF:9.120,
segment-101.ts
#EXTINF:8.960,
segment-102.ts
#EXT-X-ENDLIST ← 如果文件在持续更新,没有这一行
← 直播场景不写 ENDLIST
三、HLS 的延迟问题#
HLS 延迟 = 切片时长 + 播放器缓冲
假设每 2 秒切一个 TS 文件:
推流器切完一个文件 → 放到服务器 → 更新 m3u8 → 播放器下载 → 播放
最小延迟 ≈ 2 个切片 = 4 秒(播放器至少缓冲 2 个文件才能平滑播放)
提高延迟:
切片 10 秒 → 延迟 20-30 秒(稳定,兼容性好)
切片 2 秒 → 延迟 4-6 秒(延迟低,但服务器压力大)
对比:
RTMP 延迟:1-3 秒
HTTP-FLV 延迟:2-5 秒
HLS 延迟:6-30 秒
WebRTC 延迟:< 500ms
但 HLS 兼容性最好:
iOS/macOS 原生支持,不需要任何插件
浏览器通过 <video> 标签直接播放
穿越防火墙容易(走 80/443 端口)