本文初写于 2016 年,主要讨论当时常见 RTMP/HLS 直播链路中的延迟优化。当前低延迟直播还会结合 LL-HLS、WebRTC、SRT、QUIC 或云厂商私有协议,具体选型需要按端侧兼容性、延迟目标、成本和网络条件综合判断。

音视频直播系统是复杂的工程系统。要做到低延迟,需要同时优化采集、编码、传输、服务端分发和播放器缓冲策略。这里分享几个常见调优方向。

编码优化

1、确保 Codec 开启了低延迟设置。部分编码器和解码器会因为重排序、参考帧和缓冲策略在显示前缓存视频帧。对于 H.264/H.265 来说,B 帧需要依赖前后参考帧,通常会增加编码和解码延迟;低延迟直播常见做法是减少或禁用 B 帧,并使用合适的 profile、GOP 和码控参数。
2、编码器一般都会有码控造成的延迟,一般也叫做初始化延迟或者视频缓存检验器 VBV 的缓存大小,把它当成编码器和解码器比特流之间的缓存,在不影响视频质量的情况下可以将其设置得尽可能小也可以降低延迟。
3、如果仅优化首开延迟,可以在视频帧间插入较多关键帧,这样客户端收到视频流之后可以尽快解码。但如果需要优化传输过程中的累计延迟,就不能盲目增加 I 帧。GOP 越小首开和随机访问越友好,但在同等主观质量下通常会增加码率和带宽压力。音频方面,AAC-LC 延迟和兼容性通常更适合实时场景;HE-AAC / HE-AAC v2 编码效率更高,但算法延迟和兼容性需要单独评估。
4、不要使用视频 MJPEG 的视频压缩格式,至少使用不带 B 帧的 MPEG4 视频压缩格式(Simple profile),甚至最好使用 H.264 baseline profile(X264 还有一个「-tune zerolatency」的优化开关)。这样一个简单的优化可以降低延迟,因为它能够以更低的码率编码全帧率视频。
5、如果使用 FFmpeg 拉流或转码,合理降低 -probesize-analyzeduration 可以减少探测耗时。这两个参数用于格式探测和流信息分析,设置过大会增加首开耗时;设置过小也可能导致复杂流识别失败,需要结合实际输入格式测试。
6、CBR 可以让码率更稳定,便于带宽规划;VBR 可以在画面复杂度较低时节省带宽,但也可能带来码率波动。低延迟直播中不要简单认为 VBR 一定更低延迟,应结合网络稳定性、码率上限和缓冲策略选择。

传输协议优化

1、在传统长分片 HLS 链路中,分片和播放器缓冲通常会带来较高延迟;服务端内部链路使用 RTMP、HTTP-FLV、SRT 等方式,通常比传统 HLS 更容易控制延迟。当前如果播放端也要求低延迟,可以评估 LL-HLS、WebRTC 或厂商低延迟直播方案。
2、如果终端用户使用 RTMP 或 HTTP-FLV 播放,尽量在靠近推流端的收流节点进行转码,这样跨区域传输的视频流可以更小、更稳定。
3、如果有必要,可以使用基于 UDP 的协议替代 TCP 链路,以减少弱网下队头阻塞和重传带来的延迟。它的主要缺点是通用性、CDN 支持和丢包恢复复杂度更高,需要协议层自行做好拥塞控制、丢包恢复和关键帧保护。

传输网络优化

1、我们曾经介绍过七牛直播云的实时流传输网络,它是一种新型的节点自组织的网状传输网络,既适合国内多运营商网络条件下的传输优化,也适合众多海外直播的需求。
2、在服务端节点中缓存当前 GOP,配合播放器端优化视频首开时间。
3、服务端实时记录每个视频流流向每个环节时的秒级帧率和码率,实时监控码率和帧率的波动。
4、客户端(推流和播放)通过查询服务端准实时获取当前最优节点(5 秒一次),准实时下线当前故障节点和线路。

推流、播放优化

1、考察发送端系统自带的网络 buffer 大小,系统可能在发送数据之前缓存数据,这个参数的调优也需要找到一个平衡点。
2、播放端缓存控制对于视频的首开延迟也有较大影响,如果仅优化首开延迟,可以在 0 缓存情况下在数据到达的时候立即解码。但如果在弱网环境下为了消除网络抖动造成的影响,设置一定的缓存也有必要,因此需要在直播的稳定性和首开延迟优化上找到平衡,调整优化缓冲区大小这个值。
3、播放端动态 buffer 策略,这是上面播放端缓存控制的改进版本。如果只是做 0 缓存和固定大小的缓存之间进行选择找到平衡,最终还是会选择一个固定大小的缓存,这对亿级的移动互联网终端用户来说并不公平,他们不同的网络状况决定了这个固定大小的缓存并不完全合适。因此,我们可以考虑一种「动态 buffer 策略」,在播放器开启的时候采用非常小甚至 0 缓存的策略,通过对下载首片视频的耗时来决定下一个时间片的缓存大小,同时在播放过程中实时监测当前网络,实时调整播放过程中缓存的大小。这样即可做到极低的首开时间,又可能够尽量消除网络抖动造成的影响。
4、动态码率播放策略。除了动态调整 buffer 大小的策略之外,也可以利用实时监测的网络信息来动态调整播放过程中的码率,在网络带宽不足的情况下降低码率进行播放,减少延迟。

以上,是在低延迟优化方面的部分技巧。实际上我们优化低延迟的时候并不是只关注「低延迟」,而是在保证其它条件不影响用户体验的情况下尽量做到低延迟,因此它的内容涉及到更多广泛的话题。而视频直播的优化也包含方方面面,这里只分享了其中经过我们实践的部分。随着实践的积累,我们接下来会在线上和线下分享更多关于视频直播甚至点播的优化技巧。