FFmpeg播放器框架
一个完整的播放器框架如下:
媒体文件可以是本地文件,也可以是网络流;
解复用器主要是分离出音视频包。
音视频packet队列:这个是分开设计。为了匹配解复用器之间的速度以及防止网络抖动。
音视频解码:主要是把packet数据变为frame。
音视频frame队列:主要是为了匹配解码和音视频后期处理,播放的速度及防止网络抖动,带来不好的体验,比如卡顿等。
扬声器与显示器:分别是播放声音和渲染视频。
常用音视频术语
容器/文件(Conainer/File):即特定格式的多媒体文件,比如mp4、flv、mkv等。
媒体流(Stream):表示时间轴上的一段连续数据,如一段声音数据、一段视频数据或一段字幕数据,可以是压缩的,也可以是非压缩的,压缩的数据需要关联特定的编解码器(有些码流音频他是纯PCM)。
数据帧/数据包(Frame/Packet):通常,一个媒体流是由大量的数据帧组成的,对于压缩数据,帧对应着编解码器的最小处理单元,分属于不同媒体流的数据帧交错存储于容器之中。
编解码器:编解码器是以帧为单位实现压缩数据和原始数据之间的相互转换的。
复用器:按照一定的规则去组合音频,视频,字幕等。如下图:
解复用器:
按照一定规则去拆分视频流,音频流,字幕流等。
视频编解码器:如下图。
音频编解码器:如下图
FFmpeg的整体结构
FFMPEG有8个常用库:
AVUtil:核心工具库,下面的许多其他模块都会依赖该库做一些基本的音视频处理操作。
AVFormat:文件格式和协议库