播放器核心架构
模块解释
文件读取
读取视频文件、读取网络文件、读取音频文件,大概分为这三种,目前代码中仅实现了读取视频文件播放,也就是当没有video数据的时候播放器不可使用。
解复用
容器指的是多媒体文件中的封装格式,常见的封装格式有mp4、flv、ts等,其作用就是将不同的流数据进行封装,便于传输和存储。
这一步就是解析多媒体文件中容器,将容器中的视频流、音频流、字母等数据分离出来。从而输入到视频解码器、音频解码器。
编码的视频数据格式有H264、H265等,编码的音频数据格式有AAC、AC3等。
视频解码器
视频解码器是可以是一种硬件或者软件,它的作用是将视频压缩数据解码成原始的视频数据,以便于后续的渲染和显示。
在本项目中,使用的是ffmpeg库中的解码器,如果在商业项目中,可能会使用硬件解码器,目的是释放CPU资源,提高性能。
解码后的数据可能是RGB、YUV等,具体看输出要求来配置解码器即可。
图像处理
目前比较好用的图像处理开源库有ffmpeg、opencv等。可以使用这些库来完成视频的缩放、旋转、裁剪、特效等操作。
音频解码器
音频解码器与视频解码器类似,也可以在软件或者硬件来实现其功能。
解码后的音频数据为PCM数据,不过需要区分音频的通道数、采样率、采样精度。
音频重采样
音频数据参数有sample_rate、sample_fmt、channel_layout等。sample_rate是指每秒采样的次数,sample_fmt是指采样的精度,channel_layout是指声道布局。在不同的平台上由于硬件的差异,可能会出现音频格式不支持的情况,这时候就需要对音频数据进行重采样,来生成符合硬件输入的音频数据。
音效
音效添加可以使用开源的Sox库来实现。它支持的音效种类很多包括drc、peq、compand、echo等。
视频渲染
视频渲染是将解码后的视频数据渲染到屏幕上,以实现视频播放的功能。
本项目中会介绍两种视频数据渲染的方法分别为SDL与qml。由于最后需要画UI,所以使用了qml。
音频播放
本项目使用SDL库来实现音频播放。****
AvSync
AvSync其实就是音视频同步,如果音视频不同步,会严重影响观影体验,这一项也是区分播放器好坏的关键参数。本项目实现逻辑是使视频的pts与音频的pts保持一致,从而实现音视频同步。