使用 HLS 协议进行直播时,很多开发者都会遇到一个头疼的问题:延迟太高。传统 HLS 直播的延迟通常在 15-30 秒之间,这对于互动直播、体育赛事、在线教育等场景显然是无法接受的。本文将深入分析 HLS 延迟的来源,并介绍几种成熟的优化方案,帮助你将直播延迟降到 3 秒甚至更低。
HLS 直播延迟从哪里来?
HLS 的高延迟并非设计缺陷,而是其切片机制 inherent 的特性。一个典型的 HLS 直播流程中,延迟主要来自以下几个环节:
- 切片时长(GOP 长度):HLS 播放器必须等待一个完整的 TS 切片生成后才能开始下载。如果切片时长为 10 秒,这里就产生了平均 5 秒、最大 10 秒的延迟
- 播放器缓冲区:为了应对网络波动,播放器通常会缓冲 3 个切片才开始播放。3 个 10 秒切片 = 30 秒缓冲
- 编码延迟:视频编码器需要将一组帧(GOP)编码完成后才能输出,这通常增加 1-2 秒延迟
- CDN 回源与分发:切片文件上传到 CDN 并分发到边缘节点,需要 1-3 秒
将这些环节累加起来,传统 HLS 直播产生 15-30 秒延迟就不足为奇了。
方案一:LL-HLS 低延迟技术
Apple 在 2019 年推出了 Low-Latency HLS(LL-HLS) 协议扩展,旨在将 HLS 延迟降到 2-3 秒级别,同时保持与现有 CDN 架构的兼容性。
LL-HLS 的核心机制
- 片段式传输(Partial Segments):将传统 6-10 秒的切片进一步切分为更小的部分片段(约 200ms-1s),播放器无需等待完整切片即可开始下载和播放
- 阻塞式播放列表加载(Blocking Playlist Reload):播放器在请求 M3U8 播放列表时,服务器会保持连接直到新内容就绪,减少轮询间隔
- 预加载提示(Preload Hints):服务器提前告知播放器下一个片段的地址,减少请求往返时间
- HTTP/2 PUSH:服务器主动将部分片段推送给播放器,进一步减少请求延迟
FFmpeg 生成 LL-HLS 的命令
ffmpeg -re -i input.mp4 \
-c:v libx264 -preset fast -tune zerolatency \
-c:a aac -b:a 128k \
-f hls \
-hls_time 2 \
-hls_flags partial+independent_segments \
-hls_playlist_type event \
-method PUT \
http://server/live/stream.m3u8
方案二:CMAF 碎片封装格式
CMAF(Common Media Application Format) 是由 MPEG 标准化的媒体封装格式。它的核心思想是:使用一套统一的媒体分片格式,同时服务于 HLS 和 DASH 两种协议。
CMAF 如何降低延迟
- CMAF 采用 Chunked Transfer Encoding,不需要等待完整的切片文件生成,而是边生成边传输
- 结合 CTE(Chunked Transfer Encoding) 和 HTTP/1.1 或 HTTP/2,可实现服务器到播放器的实时数据推送
- CMAF 分片可以被 HLS(通过修改后的 M3U8)和 DASH(通过 MPD)同时引用,实现"一份内容,多种协议"
💡 注意:CMAF 对 CDN 和播放器都有要求。CDN 需要支持 Chunked Transfer Encoding,播放器需要支持 CMAF Low Latency 模式。目前主流 CDN(CloudFront、Akamai、阿里云 CDN)和播放器(hls.js、Shaka Player)均已支持。
方案三:服务端参数调优
如果你暂时无法升级到 LL-HLS 或 CMAF,通过调整传统 HLS 的服务端参数也能获得明显的延迟改善:
- 缩短切片时长:将
hls_time从 10 秒改为 2-3 秒。这是最简单有效的优化手段 - 减少播放列表长度:将
hls_list_size 从默认的 5 改为 3,播放器缓冲的数据量更少 - 使用 zerolatency 预设:FFmpeg 编码时添加
-tune zerolatency,牺牲少量压缩率换取更低的编码延迟 - 优化 GOP 结构:将关键帧间隔(GOP size)设置为与切片时长一致,通常为帧率的 2-3 倍
三种方案如何选择?
| 方案 | 延迟水平 | 适用场景 | 改造难度 |
|---|---|---|---|
| 服务端参数调优 | 8-15 秒 | 现有系统快速优化 | 低(改配置) |
| LL-HLS | 2-4 秒 | Apple 生态、移动端直播 | 中(需升级播放器) |
| CMAF + CTE | 2-3 秒 | 大规模分发、多协议兼容 | 高(需 CDN 支持) |