在处理音视频数据时,解码音频的数据往往会比解码视频的数据比较慢,所以我们在播放音视频时,音频和视频的数据会出现渐渐对不上的情况。尤其在播放时间越长的时候,这种对不上的现象越明显。
为了解决这一问题,人们想出了3种方法:
1、音频向视频同步
2、视频向音频同步
3、音频和视频向系统时钟同步
在音视频处理中,每一帧音频或者视频都会有一个与之关联的时间戳,所以向音频或者视频同步,其实就是向它们的时间戳进行同步。
在这3种方法中,人们通常会选择第2种方案,即视频向音频同步,因为人耳对声音的延迟更敏感。本文也是用的这个方案。
它的实现也非常简单。首先就是分别获取当前播放的音频和视频的时间戳,然后计算当前视频与音频的时间差,如果视频比音频快,就根据这个时间差进行相应的延迟;如果视频比音频慢,就丢弃当前帧:
qreal vs = frame->pts * av_q2d(videoStream->time_base);//+ frame->pkt_duration * av_q2d(videoStream->time_base);
qreal as = AudioThread::get()->getTime();
double diff_time = vs - as;//计算视频显示时间与音频播放时间之间的差值
if (diff_time > 0)
{
double fps_delay = 1.0 / fps;//计算每帧的延迟,通过将 1.0 除以帧率(fps)来得到
double real_delay = fps_delay;
av_usleep((diff_time + real_delay) * 1000 * 1000);
}
else
{
//audio faster
if (fabs(diff_time) >= 0.05)
{
qDebug() << "unref";
//丢帧
av_frame_unref(frame);
msleep(1);
}
}
demo下载:点击跳转
觉得有帮助的话,打赏一下呗。。