一般来说,视频直播中的延迟一般分为启动延迟、播放延迟和累计延迟。

1.启动延迟

定义:视频播放要等到IDR才能开始播放,假设rtmp没有缓冲Gop Cache off,是有⼀帧数据就发⼀帧。 如果⽤户开启播放的时刻正是在GOP组的中间1/3,⽤户要等到下⼀个IDR到来时才能播放,则等待画⾯出现时间为2/3Gop。平均时间为1/2 (Gop time),如果没有开启Gop Cache off,是没有办法实现首帧秒开。

上面问题的解决办法:开启Gop Cache。

开启Gop Cache又会引入新的问题。就是播放延迟增大,所以首帧秒开,并不能解决延迟的问题。为什么呢?

原因:由于开启Gop Cache,服务器在⽤户连接时,会从上⼀个IDR位置发包,则引⼊了播放延迟,同样这个播放延迟的均值为1/2 (Gop Time),这个延迟时间就是由缓冲导致的。

针对这个因为服务器缓存cache带来的播放延迟,有什么解决办法呢?

解决办法:

快速播放。⽐如说 cache 可能缓存了 5 秒(cache不适合缓存太长)的数据,为了控制延迟在 2 秒,就会把前 3秒的都统⼀成⼀个时间戳,缓冲的视频帧下发给播放端,会有快速播放的效果,这样会减少延时。

2.播放延迟

播放延迟定义:⽤户播放画⾯的时间,与推流端画⾯的时间差。

解决办法: 如果客户端(缓存关闭),服务器(缓存关闭),编码器(B帧⽆),那么延迟可以做到最低延迟时间:编码时间+⽹络延迟(包含路由器缓存的⽹络往返时间)

Gop Cache on,将极⼤影响播放延迟均值为1/2(Gop time),但关闭会引发启动延迟均值为1/2(Gop

time),所以这个缓冲是否开启,根据自己的需求来设计。

播放延迟与启动延迟折中的办法?

解决⽅案:Gop Time 在推流端设为⼩,这样可以兼顾启动延迟和播放延迟。

引入问题:同样码率情况,视频编码效率变低,带宽消耗大。

解决办法:扩大带宽,但是成本上升。

所以上面每一个解决办法,都有可能带来新的问题,一定要根据自己的需求来设计参数。

3.累计延迟

累计延迟定义:由于推流端与播放端的带宽速度不对称,⽽rtmp是tcp不丢包连接, 所以当播放端卡顿时,推流速度⼤于播放速度,⽽在卡顿后播放器并不加速播放,将使服务器的缓存空间变⼤,客户端缓存变⼤,使得播放延迟变⼤。累计延迟需要监控编码码率和发送码率的情况,解决办法如下:

服务端解决办法:删除缓存数据⾄上⼀个GOP的IDR位置。

客户端解决办法: 当客户端缓存太⼤,客户端⾃动断开连接重连。

4.总结

(1)Gop cache 开启,可解决启动延迟问题,但加⼤播放延迟

(2)延迟要可控的话,与Gop Time 有重⼤关系,推流端要求可控。

(3)实际某次测试的延迟与开启播放的时间点有关,当播放端开启播放的时刻恰好在IDR位置,则直播延迟为(0+⽹络延迟), 所以延迟应⽤均值表示较为妥当,同时测试时,也应在多个时间点采样。

(4)累计延迟要⽤以上办法规避。

关于延迟就分享到这里,欢迎关注,点赞,转发,分享。

相关推荐