ffmpeg实战系列——001

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实战代码分析了。

原文地址:https://www.cnblogs.com/stnlcd/p/7149905.html