初学FFmpeg,里面的数据结构不清楚,特地整理了FFmpeg基础,方便时常回顾。
1、AVFormatContext
封装格式上下文结构体,描述了一个媒体文件或媒体流的构成和基本信息。是其他所有结构的跟,是一个多媒体文件或流的根本抽象。也就是统领全局的结构体,保存了视频文件封装格式相关信息。
表示程序运行的当前文件容器格式使用的上下文,着重于所有文件容器共有的属性。
iformat: 输入视频的AVInputFormat,如对于mp4或mov为ff_mov_demuxer,关联相应的文件容器格式
nb_streams : 输入视频的AVStream(流)的个数
streams [MAX_STREAMS]: 输入视频的AVStream [ ] 数组,至少2个指针元素,分别指向video stream 和 audio stream,关联音视频流
duration : 输入视频的时长(以微秒为单位)
bit_rate : 输入视频的码率/
2、AVInputFormat
表示输入文件容器格式,着重于功能函数,一中文件容器格式对应一个AVInputFormat结构。
每种封装格式(例如FLV,MKV,MP4,AVI)均对应一个该结构体
name : 封装格式名称
long_name : 封装格式的长名称
extensions : 封装格式的扩展名
id : 封装格式ID
及其他一些封装格式处理的接口函数/3
3、AVStream
视频文件中每个视频(音频)流对应一个该结构体,表示当前媒体流的上下文,着重于所有媒体流共有的属性(运行时才能确定)和关联的其他结构的字段
id : 序号
codec : 该流对应的AVCodecContext,解析器,每一种编码器在进行压缩时,都会对实际负载数据进行封装,加入头信息,如h264,需要解析nal单元
time_base : 该流的时间基准,是一个实数,该流中媒体数据的pts 和dts都将以这个时间基准为粒度。
r_frame_rate : 该流的帧率
duration : 流的总时间,以流的时间基准为单位
codec : 指向该流对应的AVCodecContext结构,调用av_open_input_file() 时生成
4、AVCodecContext
编解码器上下文结构体,包含了众多编解码器需要的参数信息。保存了视频(音频)编解码相关信息
codec : 编解码器的AVCodec
codec_name/ codec_type/ codec_id/ codec_tag : 编解码器的信息
width height : 图像的宽高(只针对视频)
pix_fmt : 像素格式(只针对视频)
sample_rate : 采样率(只针对音频)
channels : 声道数(只针对音频)
sample_fmt : 采样格式(只针对音频)
5、AVCodec
每种视频(音频)编解码器(例如H.264解码器)对应一个该结构体
name : 编码器名称
long_name : 编码器长名称
type : 编码器类型
id : 编码器ID
及其他一些封装格式处理的接口函数
6、AVPacket
存储一帧压缩编码数据。
暂存解复用之后、解码之前的媒体数据(一个音/视频帧、一个字幕包等)及附加信息(解码时间戳、显示时间戳、时长等)
pts : 显示时间戳
dts : 解码时间戳
data : 为数据缓冲区指针,大小为size
size : 压缩编码数据大小
stream_index : 所属的AVStream,给出所属媒体流的索引
flags : 标志,其中最低位置1 ,表示该数据是一个关键帧
7、AVFrame
存储一帧解码后像素(采样)数据
data : 解码后的图像像素数据(音频采样数据)
linesize :
对视频来说:是图像中一行像素的大小
对音频来说:是整个音频帧的大小
width height : 图像的宽高(只针对视频)
key_frame : 是否为关键帧(只针对视频)
pict_type : 帧类型(只针对视频)。例如: I P B
8、 MovContext结构体
(PS:手敲可能有误,如您发现错题,还请指出。)