最近在尝试制作音视频播放器,翻了各种资料,已经可以正常播放抖音小视频了,但仍不知有哪些异常情况没有处理,现在就记录一下这段时间的所学与设计方案。
编程语言使用c++,界面使用qt,多媒体处理库使用ffmpeg。
概括来说,音视频播放包括解封装—>解码—>帧同步三步骤。解封装是将文件流分离成音频流和视频流;解码是对流数据进行解压缩,还原为原始数据;帧同步是依据时间戳将视频帧和音频帧进行同步播放。
为实现音视频帧同步,方案采用了三个线程。第一个线程是数据包获取线程,此线程进行数据抓包,分别将音频数据包和视频数据包放入音频包队列和视频包队列;第二个线程是视频帧播放线程,由于视频流可看做是一组分布不均匀的离散图像序列,所以需要以系统时间戳为基准,根据每一帧的时间戳来进而确定此帧图像的播放时机;第三个线程是音频帧播放线程,由于音频帧序列分布均匀,所以只需不间断的向设备中写入音频数据即可。
由此,一个功能简单的音视频播放器即可完成。