说明:
视频录制时,音频流和视频流都是通过设置的pts来确定播放时的具体时间顺序;正常情况下设置好每一帧的pts,即可保证播放的时候声音和图像能同步。具体pts设置见(一),(二)。然而,有时测试会出现,随着编码时间的加长,声音播放正常,而图片播放却越来越快;
分析发现,当camera分辨率设置较大时,可能出现帧率不稳定的情况;如设置的是1920*1080 和 30fps,但实际上平均只有29.9fps,而视频播放的时候是按设置的pts来播放的,仍然按1秒钟30帧来播放,这样就导致了随着时间越来越长,后面的图像播放越来越快。
解决办法:
以下方法可供参考:
1.由于音频的编码时间很快,数据采集也比较及时,基本没有延迟,所以,可以以音频的pts作为时间线;
2.在音频编码和视频编码入口处计算好各自的pts,同时记录当前音频和视频的pts;进行编码的时候直接使用此处计算好的pts;
3.在视频编码入口处,比较当前音频和视频的pts,若视频pts小于音频pts(如:小于200ms),则将当前计数的帧数增加一个数值(如:frameIndex += 5),否则正常执行(如:++frameIndex);
如下:
fun encode(data: ByteArray){
if(mMediaMuxer.getVideoPts() + 200000 < mMediaMuxer.getAudioPts()){
frameIndex += 5
}else{
++frameIndex
}
val pts = frameIndex * 1000000 / mRecorderParams.videoFrameRate
mMediaMuxer.updateVideoPts(pts)
mInputTask.writeData(FrameData(data, pts))
}
经过设置后,由于帧率不稳定或视频编码慢导致声音、图像不同步的问题基本可以解决。
作者:dodo128