直播画面慢半拍?HLS 延迟成因与压缩方法
先量化:你的延迟有几秒
拿手机秒表对准主播喊一声"现在",记下同一句话出现在你屏幕上的时刻,差值就是端到端延迟。传统 HLS 一般落在 10 到 30 秒;一旦超过 40 秒,多半说明配置存在优化空间。
延迟是怎么一秒秒叠出来的
这笔账并不复杂:编码端每 6 秒才切出一个 TS 分片,播放器按惯例攒够三段才起播,再加上网络传播与 CDN 分发的时间,光前两项就有 18 秒。结论很清晰——大头压在分片时长和开播缓冲上,其余环节都是零头。
不改架构的三招速调
服务器允许重新推流的话,先把分片切短:
ffmpeg -re -i input.mp4 -c:v libx264 -c:a aac -f hls \
-hls_time 2 -hls_list_size 6 -hls_flags delete_segments live.m3u8
在此基础上再叠加两条:
- 压缩起始缓冲:播放器缓存改为一到两段,并打开"落后追帧"逻辑,差距过大时自动加速追赶。
- 缩短列表轮询:减小播放列表的刷新间隔,让新分片尽早被播放器发现。
代价也要心里有数:分片变短后请求数成倍增长,源站与 CDN 的压力会明显上升。
进阶方案:LL-HLS 与部分分片
苹果的 Low-Latency HLS 把长分片拆成若干"部分分片",边生成边下发,配合预加载提示和阻塞式列表刷新,可以把延迟压进 2-5 秒区间。它要求源站与 CDN 双侧都支持相应扩展,改造前务必确认整条链路的兼容情况。
什么情况该换协议
连麦、拍卖、弹幕互动这类强实时场景,两秒仍然嫌慢,亚秒级的 WebRTC 才是对口答案;HLS 的强项在于规模化分发和简单可靠,赛事转播、在线课堂、发布会直播完全够用。服务端怎么选,可参考 自建 HLS 服务器的三种选型;想实测手里这条流的表现,丢进 首页播放器 看看即可。