FFmpeg学习之一:基本数据结构

来源:互联网 发布:cmd 映射网络磁盘 编辑:程序博客网 时间:2024/06/05 08:09

1,AVCodecContext

FFmpeg中最庞大的结构体之一,含有很多字段,主要描述编解码上下文,包含编解码需要的参数信息。结构体通常通过调用avformat_open_input和avformat_find_stream_info函数(分析输入文件)初始化,也可以手动初始化。

 

extradata/extradata_size

这个buffer中存放了解码器可能会用到的额外信息,如h.264中的sps和pps,在av_read_frame中填充。一般来说,首先,某种具体格式的demuxer在读取格式头信息的时候会填充extradata,其次,如果demuxer没有做这个事情,比如可能在头部压根儿就没有相关的编解码信息,则相应的parser会继续从已经解复用出来的媒体流中继续寻找。在没有找到任何额外信息的情况下,这个buffer指针为空。

time_base

编解码器的时间基准,实际上就是视频的帧率(或场率)

width/height

视频的宽和高

sample_rate/channels

音频的采样率和信道数目

sample_fmt

音频的原始采样格式

codec_name/codec_type/codec_id/codec_tag

编解码器的信息


2,  AVFormatContext

FFmpeg中最基本的结构体,很多函数都要用到它作为参数,是FFMPEG解封装(flv,mp4,rmvb,avi)功能的结构体。

 

AVStream **streams

描述包含的媒体流

Int nb_streams

描述媒体流的数量

AVInputFormat *iformat

输入数据的封装格式,对应demux的指针

AVOutputFormat *oformat

对应mux的指针

AVIOContext *pb

输入数据的缓存

Enum AVCodecID 音、视、字幕

编解码ID

AVCodec音、视、字幕

编解码

AVDictionary *metadata

元数据

视频的原数据(metadata)信息可以通过AVDictionary获取。元数据存储在AVDictionaryEntry结构体中,是一个键值对,通过av_dict_get、av_dict_set函数存取


3,  AVStream

描述一条媒体流,AVFormatContext中用双重指针串联媒体流。大部分域的值可以由avformat_open_input根据文件头的信息确定,缺少的信息需要通过调用avformat_find_stream_info读帧及软解码进一步获取。

 

index/id

index对应流的索引,这个数字是自动生成的,根据index可以从AVFormatContext::streams表中索引到该流;而id则是流的标识,依赖于具体的容器格式。比如对于MPEG TS格式,id就是pid

time_base

流的时间基准,是一个实数,该流中媒体数据的pts和dts都将以这个时间基准为粒度。通常,使用av_rescale/av_rescale_q可以实现不同时间基准的转换

start_time

流的起始时间,以流的时间基准为单位,通常是该流中第一个帧的pts

duration

流的总时间,以流的时间基准为单位

need_parsing

对该流parsing过程的控制域

nb_frames

这条媒体流中的帧数

r_frame_rate/framerate/avg_frame_rate

帧率相关

codec

指向该流对应的AVCodecContext结构,调用avformat_open_input时生成

parser

指向该流对应的AVCodecParserContext结构,调用avformat_find_stream_info时生成


4,  AVCodec

直接对应一种编解码器,FFmpeg中所有的编解码器都是连在一个链表中,AVInputFormat也一样,前者通过avcodec_find_decoder/ av_codec_next函数搜寻,后者通过av_find_input_format/av_iformat_next函数。

结构体中含有init/ encode2/decode/ close等函数指针,函数入口由具体要调用的编解码器决定。

 

const char *name

编解码名称

enum AVCodecID id

ID

int (*init)(AVCodecContext *)

初始化函数指针,以下均是函数指针

(*encode2)

编码

(*decode)

解码

(*close)

关闭Codec

(*flush)

刷新buffer,当seeking时使用

 

5,  AVPacket

暂存媒体数据包及附加信息(解码时间戳、显示时间戳、时长等),这样的媒体数据包所承载的往往不是原始格式的音视频数据,而是以某种方式编码后的数据,编码信息由对应的媒体流结构AVStream给出。

 

dts/ pts

解码/显示时间戳,单位是所属媒体流的时间基准

stream_index

所属媒体流的索引,如音频、视频

data/ size

编码数据/长度,如H.264通常对应一个NAL

duration

时长

pos

该数据在媒体流中的字节偏移量

destruct

用于释放数据缓冲区的函数指针

flags

标志域,最低为置1表示该数据是一个关键帧

 

6, AVFrame

一般用于存储原始数据(例如对视频来说是YUV,RGB,对音频来说是PCM),此外还包含了一些相关的信息。比如说,解码的时候存储了宏块类型表,QP表,运动矢量表等数据.


7,  AVIOContext

FFmpeg管理输入输出数据的结构体

unsigned char *buffer

缓存地址

int buffer_size

缓存大小(默认32768)

unsigned char *buf_ptr

当前指针读取到的位置

unsigned char *buf_end

缓存结束的位置

void *opaque

URLContext结构体

buffer用于存储ffmpeg读入的数据。例如打开一个视频文件的时候,先把数据从硬盘读入buffer,然后在送给解码器用于解码。URLContext结构体中包含一个结构体URLProtocol,URLProtocol中含有协议名以及各种与读写相关的函数指针,具体入口由调用的协议决定。比如file、udp、rtmp等。

 


0 0
原创粉丝点击