视频传输过程中的缓冲时间自适应算法
在音视频的实时传输过程中,缓冲时间对于播放的效果十分重要。这个值设多大合适呢?为了达到实时性,当然是在满足质量要求的条件下越小越好了。
但网络延迟及一些其它因素是多变的,而且是不可预测的。因此在程序中硬编码一个值肯定是合适的。如果这个值设置小了,肯定会很卡,如果设置大了,延迟又太大了,实时性又差了。最好就是根据网络延迟及延迟波动自动调整最好不了。
1.每一帧延迟的计算
假设发送方的参考时间为s0, 接收方的参考时间为R0, s0与R0可以同步设置.Si - S0 == Ri - R0 + di. di= Ri - R0 + S0 - Si
延迟波动为相领两帧的延迟差的绝对值. vi = |di - dj|, d=i-1
为了使延迟及延迟波动较为平滑,可以用历史值占较大比重,当前值占较小比重。设u为1/16,则
d = d*15/16 + di/16
v=v*15/16 + vi/16
为了容许一定的延迟波动,实际的缓冲时间可以用延迟加上延迟波动乘以一个系数K,设置K=5
则pi = ri + d + K*v
在延迟变大时,视频可以考虑慢放,在缓冲时间由大变小时,可以考虑快放,这样就不需要丢帧,保证所有帧都解压并显示出来。声音在缓冲时间变化时只能停顿或丢弃一些帧。
经过测试,在实际的网络环境下,此算法级保证一个比较稳定的并且比较理想的缓冲时间。