音视频推流中的时间问题

web上看直播对时间的要求是十分苛刻的。时间需要均匀的变化。这在局域网或者是电脑PC端并不是十分大的问题。因为网络通常是稳定可靠的。但在移动终端中,网络是不稳定的,从而造成音视频数据中时间戳很可能是变化不是平稳的。前面我们已经提到平滑在web上展示的重要性,我们现在进一步讨论这种平滑的解决方案:

首先,我们需要平滑时间,就需要根据前面时间戳的变化来推断下一个时间戳的时间,避免web在播放的时候因为时间戳“突然死亡”。

1. 我们采用前面点的平均值得出当前点时间。如前面12个点的平均值,从而估算出当前的时间戳。

先将时间戳如缓冲区

fVideoCalTime[thiz->fVideoIndex_calculate++ % MAX_CALCULATE_TIME] = FrameInfo.Timestamp ;

2. 

计算出大的缓冲区的增益。就是单个帧前后时间差的平局值

thiz->fVideoPTSIncrement = (FrameInfo.Timestamp - thiz->fVideoTimestamp[thiz->fVideoIndex%TIMESTAMP_CANCULATE_BUFFER_SIZE] + (TIMESTAMP_CANCULATE_BUFFER_SIZE>>1))/(TIMESTAMP_CANCULATE_BUFFER_SIZE);

3. 根据当前点的前面12个点的时间,和时间增益估算出当前点的时间值

for (i = 0; i < MAX_CALCULATE_TIME; i++)
 {
                TT += thiz->fVideoCalTime[i];
                    
  }
  thiz->RealTimeVedio = (TT / MAX_CALCULATE_TIME) + (thiz->fVideoPTSIncrement * MAX_CALCULATE_TIME / 2);

经过以上平滑处理后,时间波动明显变小。需要注意的是,如何处理前面12个点的时间波动成为了关键!

扫描二维码关注公众号,回复: 11905616 查看本文章

目前我们是根据前面点的平均值来估算出新入节点的时间。不过后续需要完善。

有关源码和讨论欢迎关注开源网站:https://github.com/Car-eye-team

猜你喜欢

转载自blog.csdn.net/Car_eye/article/details/85273016