记一次录制mp4音视频不同步问题的排查过程
现象:录制系统中收录rtmp流并用mp4v2写mp4文件。视频采用的是rtmp包里的时间戳但是音频若使用rtmp包里时间戳则同步,而采用自行计算的时間戳则不同步
- 录制系统主要收录实时RTC的音视频数据,在这种情况下音频时间戳采用自行计算的值。后
面加入rtmp流的收录没有调整音频時间戳的逻辑。- 所谓自行计算是:若音频采样率为44100Hz编码为aac,因为一帧aac包含1024个采样则一帧aac音频的时长为1024?1000/44100≈23ms。(当然我们要处理余数嘚情况,累加到之后音频帧时间戳的计算)
现在有对应的两个mp4文件分别对应tb.mp4(采用rtmp时间戳,同步)、btb.mp4(采用自行计算时间戳不同步)。
分析视频文件是否同步的一般步骤:(以tb.mp4为例进行分析)
- 使用工具将视频文件中每一个音频/视频帧的时间戳打印出来
这里使用flvpusher这个工具 里面包含解析flv、mp4文件的模块,简单修改下代码可将每一帧音视频时间戳打印至日志文件。格式如下:
- 分析前后两帧音频的时间戳是否異常
发现有音频帧间隔过大的情况
- 分析前后两帧视频的时间戳是否异常
发现有视频帧间隔过大的情况
- 分析整体的音频/视频时间戳是否偏移過大
音频终止时间戳:2869939
视频终止时间戳:2869828
发现整体的偏移情况还好(ms)而不同步的视频文件偏移则过大:(ms) 音频起始时间戳:0
音频终止時间戳:2865152
视频终止时间戳:2869828
我们继续对比tb.mp4和btb.mp4文件里面的音频流:
使用ffmpeg命令将两者的音频流解码为pcm并dump到文件发现时长完全一致。
对此这個问题的结论如下:
因为输入流rtmp本身存在音频少的情况,但宏观上出来的音视频流还是同步的(rtmp时间戳基本同步)若是自行计算音频时間戳,则音频会被缩短至媒体文件的头部导致越来越出现不同步,直至最后出现只有画面没有声音的情况