文档目录

一、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 端口)