不同播放器对时间戳异常的兼容性不同,不同客户流的时间戳情况也不同,为了降低误纠正,一般只对明显异常场景进行纠正。
整体纠正方案如下:
duration:前后帧的时间戳差
delt:前后同类型帧的时间戳差
① 微小的回退或突增不触发纠正
原因:有些客户原始流时间戳虽回退或突增,但实际音画是同步的,如触发纠正delt或者duration发生改变,可能导致音画不同步
② 头部时间戳走自己的逻辑
原因:一般播放器不要求头部时间戳一定要递增,一般只要求起始的音视频头时间戳一致即可,不排除客户端逻辑特殊,故提供给用户选择,可通过跟随后一帧时间戳也可以实现时间戳递增。
③ 音视频纠正核心逻辑如下:
当duration在正常范围内时,纠正后时间戳=上一帧纠正后的时间戳+duration(纠正前);
当duration不在正常范围内时,但delt正常时,纠正后的时间戳=上一同类型纠正后的时间戳+Delt(纠正前)
当duration和delt不在正常范围内时,纠正后的时间戳=max(上一同类型帧,上一帧)纠正后的时间戳+上一同类型帧在阈值范围内的delt值
通过上述逻辑,可以实现在保证时间戳正常递增情况下,原始流的duration或者delt恢复正常时,即可快速恢复,不会因为时间戳纠正而扩大影响时长导致原始流音画不同步。