1 概述
按照DirectShow 对播放器模块的划分,一个完整的播放器应该需要获得以下四个模块支持:
Source Filter : 数据源,可以是本地文件fopen, 也可以是网络文件,http,rtp,rtmp 等等
Demux Fliter: 解复用,下载的数据是带容器封装的,需要Demux Filter 解析头部信息,分离音频,视频流,然后送到对应的解码器。
Decoder Fliter :对音频,视频流进行解码输出。
Render Filter:显示模块,这个FFMPEG 并没有去集成,它也是采用SDL render.
敲黑板:FFMPEG是一个多媒体的框架!!! 对用户而言,它统一了不同IO 协议,不同封装格式,不同编解码格式的接口, 用户在使用时只用关注自己业务逻辑就行,下面我们将根据以上4个模块来拆解FFMPEG 架构。
2 Source Filter
在FFMPEG 中,Source Filter 可以分三层,最底层是local file , http,rtp 等具体的文件协议,第二层是URLContext ,它的成员URLProtocol 则指向具体协议的open/read. 第三层AVIOContext 在URLContext 基础上加了buff 管理。
对应到FFMPEG 具体的类,可表示为: AVIOContext < URLContext < URLProtocol ,分别对应的文件为:aviobuf.c, avio.c ,file.c 。 URLProtocol 指向的是具体的协议,比如本地文件,在File.c 里面有这样一个定义:
const URLProtocol ff_pipe_protocol = {
.name = "pipe",
.url_open = pipe_open,
.url_read = file_read,
.url_write = file_write,
.url_get_file_handle = file_get_handle,
.url_check = file_check,
.priv_data_size = sizeof(FileContext),
.priv_data_class = &pipe_class,
.default_whitelist = "crypto"
};
这会在初始化的时候根据不同的URL去指定,当上层调用open /read 函数时候,对应本地文件来说对应file_open/file_write,其实就是C 库支持的fopen/fread.
URLProtocol,它根据URL 指向具体的文件协议,使用者无需区分具体的文件协议,因为这里统一了文件协议API. 如下图,展现加载过程,url_protocols[i]包含具体文件协议的函数,然后匹配对应为文件协议。
AVIOContext 则是实现对读取的数据进行Buff 管理。
问AVIOContext, URLContext, URLProtocol, FileContext 之间的关系?
答:它们关系如下图所示,URLProtocol,FileContext 都是URLContext 的成员,分别对应*prot, *priv_data. URLProtocol 统一了各个IO 协议的接口,FILEContext是本地文件协议的上下文。URLContext 是AVIOContext 成员(URLContext = AVIOConetx->opaque->h), 而AVIOContext 相对于URLContext加了buff 管理,其他IO 协议也可以类比。
3 Demux Fliter
Demux Fliter 可分为两层,底层是FLVContext,AVIContext 等等这些具体的文件封装,善上层是AVFormatContext, 它的成员struct AVInputFormat *iformat; 则指向具体的封装文件,统一了API,使用者无需区分具体的格式的文件。层次关系如下图所示:
4 Decoder Fliter
Decoder Fliter 实现解码功能, 也是播放器的核心和难点。 它可以分为两层,最底层是具体的编码格式,如H264,VP8,VP9等等,上层是AVCodecContext,它的成员AVCodec *codec; 则指向了具体的编解码格式,统一了编解码的API 接口,使用者调用统一的API即可,无需区分具体的编解码格式。其层次关系如下图所示:
5 Render Filter
解码后的数据就可以送到喇叭或者屏幕上输出了,FFMPEG 并没有集成render 模块,采用的是SDL 去输出声音和图像。
粉丝福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓