FFmpeg 常用数据结构


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

简介

FFMPEG中结构体很多。

image.png

最关键的结构体可以分成以下几类:


a) 解协议(http,rtsp,rtmp,mms)


AVIOContext,URLProtocol,URLContext主要存储视音频使用的协议的类型以及状态。URLProtocol存储输入视音频使用的封装格式。每种协议都对应一个URLProtocol结构。(注意:FFMPEG中文件也被当做一种协议“file”)


b)解封装(flv,avi,rmvb,mp4)


AVFormatContext主要存储视音频封装格式中包含的信息;AVInputFormat存储输入视音频使用的封装格式。每种视音频封装格式都对应一个AVInputFormat 结构。


c)解码(h264,mpeg2,aac,mp3)


每个AVStream存储一个视频/音频流的相关数据;

每个AVStream对应一个AVCodecContext,存储该视频/音频流使用解码方式的相关数据;

每个AVCodecContext中对应一个AVCodec,包含该视频/音频对应的解码器。

每种解码器都对应一个AVCodec结构。


d) 存数据


视频的话,每个结构一般是存一帧;音频可能有好几帧

解码前数据:AVPacket

解码后数据:AVFrame


描述与分析

FFMpeg中主要数据结构存在包含关系,如下标题显示的就是包含层级的关系。


AVFormatContext ->AVStream-> AVCodecContext -> AVCodec,其中后者是前者的数据成员。


AVFormatContext是一个贯穿始终的数据结构,很多函数都用到它作为参数,是输入输出相关信息的一个容器。

主要成员如下:

1.AVInputFormat和AVOutputFormat,同一时间只能存在一个。当播放视频时AVInputFormat生效,录制视频时则AVOutputFormat生效。


2.AVStream是继AVFormatContext之后第二个贯穿始终的数据结构,它保存于数据流相关的编解码器、数据段等信息,还包含“流”这个概念中的一些信息。


2.1AVCodecContext保存AVCodec指针和与codec相关的数据。

在AVStream初始化后,AVCodecContext的初始化时Codec使用中最重要的一环。

AVCodecContext中的codec_type,codec_id二个变量对于encoder/decoder的匹配来说,最为重要。


AVCodecContext中有两个成员:AVCodec,AVFrame。

2.1.1 AVCodec记录了所要使用的Codec的信息并有5个函数:init,encoder,close,decode,flush来完成编解码工作。

2.1.2 AVFrame中主要包括了编码后的帧信息。

typedef struct AVFrame {

    FF_COMMON_FRAME

} AVFrame;

其中FF_COMMON_FRAME是以宏出现的,由于编码过程中AVFrame中的数据是要经常存取的,为了加速,采取这样的代码手段。





好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***