视频文件解复用之后视频流和音频流是独立的,也是独立播放。由于压缩方式不同,数据格式不同,在播放的时候音频流输出是线性的而视频流输出不是线程的,这就会导致视频流和音频流的时间偏差越来越大,最终导致音视频不同步。
为了解决这个问题,我们在播放视频文件的时候需要调整音频或者视频的播放速度,来实现两种数据的同步。考虑到人对声音的敏感度要强于视频,频繁调节音频会带来较差的观感体验,且音频的播放时钟为线性增长,所以一般会以音频时钟为参考时钟,将视频同步到音频上。
这里以一个将视频流同步到音频流上的例子来说明一下音视频同步的实现方式。程序的架构图如下图所示:
定义全局数据类
首先定义全局数据类,用于不同线程之间的数据共享。主要数据结构VideoState记录了音视频文件的各种上下文参数。
//define.h
#ifndef _DEFINE_H_
#