ffmpeg重要结构体之AVFrame和AVFormatContext

通过对FFmpeg的基本了解,我们知道可以通过利用其so库文件,输出YUV图像到文件,而解码后的图像(YUV)数据是存放在AVFrame结构体中的。
第一部分我们就来了解下结构体AVFrame,源代码在 libavutil/frame.h中,
运行输出YUV文件的解码程序对某媒体文件进行解码,在输出第一帧图像后,pFrame(为AVFrame结构的变量)见下图:

ffmpeg重要结构体之AVFrame和AVFormatContext

其中主要的变量包括:

uint8_t *data[AV_NUM_DATA_POINTERS]:指针数组,存放YUV数据的地方。如图所示,一般占用前3个指针,分别指向Y,U,V数据。

int linesize[AV_NUM_DATA_POINTERS]:图像各个分量数据在此结构体中的的宽度。注意这并不是图像的宽度。在此例子中图像的尺寸为672X272,而亮度分量的宽度为704,应该是图像宽度经过64对齐后的结果。

uint8_t **extended_data:指向了图像数据。

int width, height:图像的宽高。

int nb_samples:此帧音频的点数。

int format:像素类型(视频),样点类型(音频)

int key_frame:是否关键帧,此例中为视频的第一帧,当然是关键帧了。

enum AVPictureType pict_type:图像类型,I,P,B等,同样,第一帧是I帧。

AVRational sample_aspect_ratio:像素的宽高比,注意不是图像的。

int64_t pts,pkt_pts,pkt_dts:和时间戳有关的变量,以后会详细介绍。

int coded_picture_number:编码顺序的图像num。

int display_picture_number:播放顺序的图像num。
ffmpeg重要结构体之AVFrame和AVFormatContext
int interlaced_frame:图像是否是隔行的。

int top_field_first:图像的top field first变量。

int64_t pkt_duration:对应packet的显示时长。

int pkt_size:对应packet的尺寸。

int8_t *qscale_table:据推测是存放qp(量化参数)的数组

AVBufferRef *qp_table_buf:成员data指向qscale_table。

老版本的ffmpeg在此结构体中还存有mv,mb_type等信息,现在都没有了。

第二部分 AvFormatContext讲解
结构体AVFormatContext位于文件libavformat/avformat.h中
其中主要的成员:

struct AVInputFormat *iformat:输入文件的格式。解码某mp4文件如图:
ffmpeg重要结构体之AVFrame和AVFormatContext
可从iformat中得到MP4格式的相关信息。

AVIOContext *pb:IO上下文结构体,这个以后详细介绍。

unsigned int nb_streams:文件中流的数量。(比如值为2,一个音频流,一个视频流)

AVStream **streams:流结构体。以后详细介绍。

char filename[1024]:文件名。

int64_t duration:流的持续时间,单位微秒?

int64_t bit_rate:比特率。单位bps

int64_t probesize:判断文件格式(format)需要读入的文件尺寸

int max_ts_probe:解码TS格式时,在得到第一个PTS前可解码的最大packet的数量。

int ts_id:TS格式中流的pid。

关于AvFrame和AvFormatContext讲解暂靠一段落,不足之处请谅解