音视频同步

基础

视频帧率

一秒显示的视频帧数

音频采样率

一秒播放音频的样本数

DTS

解码时间戳,表示压缩帧的解码时间

PTS

显示时间戳,表示将压缩帧解码后得到的原始帧的显示时间

时间基

时间戳值乘以时间基,可以得到实际的时刻值,例如,如果一个视频帧的 dts 是 40,pts 是 160,其 time_base 是 1/1000 秒,那么可以计算出此视频帧的解码时刻是 40 毫秒(40/1000),显示时刻是 160 毫秒(160/1000)

uintXX_t

在C语言中有6种基本数据类型:short、int、long、float、double、char, typedef用来定义关键字或标识符的别名,_t 表示这些数据类型是通过typedef定义的,而不是新的数据类型.也就是说,它们其实是我们已知的类型的别名
typedef signed char int8_t;
typedef short int int16_t;
typedef int int32_t;
typedef long int int64_t;

方案

音视频同步目前业界有三种方案目前选择的是方案一
方案一 视频同步音频(推荐)
方案二 音频同步视频
方案三 音视频同步到外部时钟上

原理

通过 AMediaCodecBufferInfo.presentationTimeUs / (double)1000000 获取视频pts
通过 av_gettime_relative() / 1000000.0 获取音频pts
通过 int64_t diffTime = static_cast((videoPts - audioPts) * 1000) 得到时间差
如果diffTime>0说明视频比音频快,这时我们要让视频等下音频sleep_for(std::chrono::milliseconds(diffTime));
如果diffTime<0 说明音频比视频快,通过AVDiscard方法进行丢帧
AVDISCARD_NONE 不丢弃
AVDISCARD_DEFAULT 丢弃 avi 中的无效数据(如:size == 0)
AVDISCARD_NONREF 丢弃所有的非参考帧
AVDISCARD_BIDIR 丢弃所有的双向帧
AVDISCARD_NONINTRA 丢弃所有非内帧
AVDISCARD_NONKEY 丢弃所有非关键帧
AVDISCARD_ALL 丢弃所有帧

你可能感兴趣的:(音视频同步)