FFmpeg 组成
模块:
- avcodec:编解码(最重要的库)。
- avformat:音视频的封装格式处理。
- avfilter:滤镜特效处理。
- avdevice:各种设备的输入输出。
- avutil:实用工具库(大部分库都需要这个库的支持),包括算术运算,字符操作。
- postproc:音视频应用的后处理,如图像的去块效应。
- swresample:音频采样数据格式转换。
- swscale:视频像素数据格式转换
常用结构
FFmpeg里面最常用的数据结构,按功能可大致分为以下几类(以下代码行数,以branch: origin/release/3.4为准):
1. 封装格式
AVFormatContext
描述了媒体文件的构成及基本信息,是统领全局的基本结构体,贯穿程序始终,很多函数都要用它作为参数;
AVInputFormat
解复用器对象,每种作为输入的封装格式(例如FLV、MP4、TS等)对应一个该结构体,如libavformat/flvdec.c的ff_flv_demuxer;
AVOutputForma
复用器对象,每种作为输出的封装格式(例如FLV, MP4、TS等)对应一个该结构体,如libavformat/flvenc.c的ff_flv_muxer;
AVStream
用于描述一个视频/音频流的相关数据信息。
2.编解码
AVCodecContext
描述编解码器上下文的数据结构,包含了众多编解码器需要的参数信息;
AVCodec
编解码器对象,每种编解码格式(例如H.264、AAC等)对应一个该结构体,如libavcodec/aacdec.c的ff_aac_decoder。每个AVCodecContext中含有一个AVCodec;
AVCodecParameters
编解码参数,每个AVStream中都含有一个AVCodecParameters,用来存放当前流的编解码参数。
3. 网络协议
AVIOContext
管理输入输出数据的结构体;
URLProtocol
描述了音视频数据传输所使用的协议,每种传输协议(例如HTTP、RTMP)等,都会对应一个URLProtocol结构,如libavformat/http.c中的ff_http_protocol;
URLContext
封装了协议对象及协议操作对象。
4. 数据存放
AVPacket
存放编码后、解码前的压缩数据,即ES数据;
AVFrame
存放编码前、解码后的原始数据,如YUV格式的视频数据或PCM格式的音频数据等;
参考: