开始前的BB
有些没有接触过的童鞋可能还不知道音视频同步是什么意思,大家印象中应该看到过这样的视频,画面中的人物说话和声音出来的不在一起,小时候看有些电视台转播的港片的时候(别想歪 TVB)有时候就会遇到 明明声音已经播出来了,但是播的图像比声音慢了很多,看的极为不舒服,这个时候就发生了音视频不同步的情况,而音视频同步,就是让声音与画面对应上
这里有个知识点需要记一下
人对于图像和声音的接受灵敏程度不一样,人对音频比对视频敏感;视频放快一点,可能察觉的不是特别明显,但音频加快或减慢,人耳听的很敏感
PTS的由来
音视频同步依赖的一个东西就是pts(persentation time stamp )显示时间戳 告诉我们该什么时间显示这一帧 ,那么,这个东西是从哪里来的呢?
刨根问底栏目组将带你深度挖掘
PTS是在拍摄的时候打进去的时间戳,假如我们现在拍摄一段小视频(别想歪啊),什么特效都不加,那么走的就是以下的步骤
我们根据这个图可以知道,PTS是在录制的时候就打进Frame里的
音视频同步的方式
在ffplay中 音视频同步有三种方式
- 以视频为基准,同步音频到视频
- 音频慢了就加快音频的播放速度,或者直接丢掉一部分音频帧
- 音频快了就放慢音频的播放速度
- 以音频为基准,同步视频到音频
- 视频慢了则加快播放或丢掉部分视频帧
- 视频快了则延迟播放
- 以外部时钟为准,同步音频和视频到外部时钟
- 根据外部时钟改版音频和视频的播放速度
视频基准
如果以视频为基准进行同步,那么我们就要考虑可能出现的情况,比如:
掉帧
此时的音频应该怎么做呢?通常的方法有
- 音频也丢掉相应的音频帧(会有断音,比如你说了一句,我的天啊,好漂亮的草原啊 很不凑巧丢了几帧视频,就成,,,卧槽!)
- 音频加快速度播放(此处可以直接用Audition加快个几倍速的播放一首音乐)
音频基准
如果以音频为基准进行同步,很不幸的碰到了掉帧的情况,那么视频应该怎么做呢?通常也有两种做法
1.视频丢帧 (画面跳帧,丢的多的话,俗称卡成PPT) 2.加快播放速度(画面加快播放)
外部时钟为基准
假如以外部时钟为基准,如果音视频出现了丢帧,怎么办呢?
如果丢帧较多,直接重新初始化外部时钟 (pts和时钟进行对比,超过一定阈值重设外部时钟,比如1s)
音视频时间换算
PTS 时间换算
之前我们稍微讲过pts的时间换算,pts换算成真正的秒是用以下操作
realTime = pts * av_q2d(stream.time_base)
stream是当前的视频/音频流
我们这里主要讲一下在音频解码pts可能会遇到的情况,有时候音频帧的pts会以1/采样率为单位,像
pts1 = 0 pts2 = 1024 pts3 = 2048
像我们例子中的这个视频,我们在解码一帧音频之后打印出来他的pts
std::cout<<"audio pts