最近在海思3531D平台上重构了5年前写的编解码器代码。丢掉了很多为了实现音视频同步而写的很多冗余算法。任何时候都要遵循简单为美的原则。
无论编码端还是解码端,在音视频同步中,选定音频的pts为基准。原因是音频对pts的连续性更敏感,视频慢1/3 frame time或快1/3 frame time,人眼觉察不到。
一言概之:音频pts按帧率计算累加,视频pts在按帧计算累加基础上,再加上一个适当波动值进行调节(可以是正,或者复数,波动值一定要小于 frame time)。
编码器中音视频同步算法:视频的pts要以音频的pts为基准, diff = video_pts – audio_pts; 确保视频pts在绝对值范围内波动,例如diff超过正负100毫秒,适当增加1/3 frame time, 或者减少1/3 frame time即可。
解码器中音视频同步算法:收到rtp帧,即获取系统当前时间作为pts, 音频马上解码并喂给硬件底层buffer,视频则当pts大于音频pts才喂给底层硬件解码bufer即可。
在此算法下,音视频连续工作1个月,编解码器的音视频都是同步的。
算法的缺陷:录制视频的累计时长会比绝对时间每个小时小2秒,原因是嵌入式系统的时钟精度不够,音频采样率离完美采样还是有一定差距的。也是大部分硬件都有的缺陷,算不得一个问题吧。