Talk is cheap,Show me the code!
本文部分参考了雷神的博客,加入自己的理解,新增了对每种数据结构的详细剖析!
开始玩ffmpeg之前,先把ffmpeg中常见的数据结构以及他们的之间的关系了解下,这是基础,非常重要!
FFMPEG结构体分析:AVFrame
FFMPEG结构体分析:AVFormatContext
FFMPEG结构体分析:AVCodecContext
FFMPEG结构体分析:AVIOContext
FFMPEG结构体分析:AVCodec
FFMPEG结构体分析:AVStream
FFMPEG结构体分析:AVPacket
FFMPEG中结构体很多。最关键的结构体可以分成以下几类:
a) 解协议(http,rtsp,rtmp,mms):所有格式的协议组织成一个全局链表,使用时动态绑定到具体的某种协议,如:ff_file_protocol、ff_rtmp_protocol等
AVIOContext,URLProtocol,URLContext主要存储视音频使用的协议的类型以及状态。URLProtocol存储输入视音频使用的封装格式。每种协议都对应一个URLProtocol结构。(注意:FFMPEG中文件也被当做一种协议“file”)
b) 解封装(flv,avi,rmvb,mp4):所有的demuxer,也叫AVInputFormat组织成一个全局链表,使用时动态绑定到具体的某种demuxer,如ff_flv_demuxer、ff_mpegts_demuxer、ff_avi_demuxer
AVFormatContext主要存储视音频封装格式中包含的信息;AVInputFormat存储输入视音频使用的封装格式。每种视音频封装格式都对应一个AVInputFormat 结构。
AVInputFormat:demuxer
AVOutputFormat:muxer
c) 解码(h264,mpeg2,aac,mp3):所有的decoder、encoder组织成一个全局链表,使用时动态绑定到具体的某种编解码器,如:ff_h264_decoder、ff_hevc_decoder等
每个AVStream存储一个视频/音频流的相关数据;每个AVStream对应一个AVCodecContext,存储该视频/音频流使用解码方式的相关数据;每个AVCodecContext中对应一个AVCodec,包含该视频/音频对应的解码器。每种解码器都对应一个AVCodec结构。
d) 存数据
视频的话,每个结构一般是存一帧;音频可能有好几帧
解码前数据:AVPacket
解码后数据:AVFrame
他们之间的对应关系如下所示:
分析了最新的3.3 ffmpeg后,得出如下数据关系:
先来看一下这几个数据结构,为方便格式直接上传图片:
上层调用具体格式时,函数调用的时候,第一个参数一定是:priv_data
所有的信息几乎都来自上下文结构体:priv_data
掌握了以上数据结构就可以开始我们的ffmpeg实战代码分析了。