AVFrame结构体是存储音视频原始数据(即未被编码的数据)的结构体。该结构体位于libavutil/frame.h中。分析一下结构体中里的重要变量的含义和作用,首先看一下结构体的定义:
1 | typedef struct AVFrame { |
AVFrame结构体一般是用来存储原始数据(视频数据是YUV 和RGB,音频数据是PCM)。编码的时候也存储了一些相关的信息,在使用ffmpeg进行开发的时候,AVFrame是一个很重要的结构体。
接下来我们看下结构体中重要的变量和作用:
1 | uint8_t *data[AV_NUM_DATA_POINTERS]; 解码后的原始数据,视频数据是YUV 和RGB,音频数据是PCM) |
其他的变量不再一一列举,重点学习一下一定要理解的数据:
\1. uint8_t *data[AV_NUM_DATA_POINTERS];
对于packed格式的数据会存到data[0]中,例如RGB24
对于plannar格式的数据会存到data[0],data[1]…,例如YUV420P,会分开存到Y : data[0],U :data[1],V:data[2]
\2. enum AVPictureType pict_type;包含以下类型:
1 | enum AVPictureType { |
\3. AVRational sample_aspect_ratio;
宽高比是一个分数,FFMPEG中使用AVRational表示分数
1 | typedef struct AVRational{ |
\4. int8_t *qscale_table;
QP表指向一块内存,里面存储的是每个宏块的QP值。宏块的标号是从左往右,一行一行的来的。每个宏块对应1个QP。qscale_table[0]就是第1行第1列宏块的QP值;qscale_table[1]就是第1行第2列宏块的QP值;qscale_table[2]就是第1行第3列宏块的QP值。以此类推…
宏块的个数用下式计算:
注:宏块大小是16x16的。
每行宏块数:
1 | int mb_stride = pCodecCtx->width/16+1 |
宏块的总数:
1 | int mb_sum = ((pCodecCtx->height+15)>>4)*(pCodecCtx->width/16+1) |
5.uint64_t channel_layout; 声道格式(音频)
1 |
|