概述:
最近在做的项目,涉及用FFmpeg解码视频,在本地APP播放的功能,测试同学反应播放视频音视频不同步,所以就浅浅的记录一下解决过程;
1、分析
音视频不同步主要分为三种情况:
1、拉取源视频音画就不同步
2、解码过程中音频帧跟视频帧的时间戳处理不当导致音画不同步
3、最后一个就是音频播放队列缓存太长,导致不同步
第一点通过第三方软件可以正常播放视频源,所以排除;
第二点之前分析过,通过音视频解码的pts来比较音视频帧的延迟与否,采用的策略是视频帧向音频帧对齐的方式,即保证音频帧流畅输出;
所以排除以上两点问题,就把重点排查的范围确定到第三点上;
2、排查问题
调试追踪发现,queue队列长度确实容易飙升,有时候都能达到一百多,按1秒25帧来算,音频可能会滞后3-4秒,甚至更多 image.png3、改进措施
控制播放队列长度为10,在把解码得到音频帧加入音频队列之前,先判断当前缓存队列长度是否超过最大程度,如果未超过就可以正常添加,否则解码线程就休眠等待;
int dataSize = frame->nb_samples * frame->channels * av_get_bytes_per_sample(AVSampleFormat(frame->format));
std::this_thread::sleep_for(std::chrono::milliseconds(44100/dataSize));
// 异步渲染
#warning TODO 卡顿之后就会造成音频延时 -- 已解决
// BOOL addSuccess = YES;
char *data = (char *)frame->data[0];
BOOL ret = NO;
while (!ret) {
ret = [self.audioPlayer openAudioFromQueue:data withLength:dataSize];
if(!ret) {
/// 休眠一毫秒
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
}
image.png
以上简单处理,可以解决当前音频延迟严重的问题,只是草草记录一下部分问题点,未做详细说明,如对您有帮助,深感荣幸!!!
网友评论