AVFrame结构体

typedef struct AVFrame {

#define AV_NUM_DATA_POINTERS 8

    uint8_t *data[AV_NUM_DATA_POINTERS];

    int linesize[AV_NUM_DATA_POINTERS];

uint8_t **extended_data;

    /**宽高 */

    int width, height;

    int nb_samples;

int format;

    /**是否是关键帧*/

    int key_frame;

    /**帧类型(I,B,P*/

    enum AVPictureType pict_type;

    uint8_t *base[AV_NUM_DATA_POINTERS];

    AVRational sample_aspect_ratio;

    int64_t pts;

    int64_t pkt_pts;

    int64_t pkt_dts;

    int coded_picture_number;

    int display_picture_number;

    int quality;

    int reference;

    /**QP*/

    int8_t *qscale_table;

  

    int qstride;

    int qscale_type;

    /**跳过宏块表 */

    uint8_t *mbskip_table;

    /**运动矢量表*/

    int16_t (*motion_val[2])[2];

    /**宏块类型表 */

    uint32_t *mb_type;

    /**DCT系数 */

    short *dct_coeff;

    /**参考帧列表 */

    int8_t *ref_index[2];

    void *opaque;

    uint64_t error[AV_NUM_DATA_POINTERS];

    int type;

    int repeat_pict;

    int interlaced_frame;

    int top_field_first;

    int palette_has_changed;

    int buffer_hints;

    AVPanScan *pan_scan;

    int64_t reordered_opaque;

    void *hwaccel_picture_private;

    struct AVCodecContext *owner;

    void *thread_opaque;

    /**

     * log2 of the size of the block which a single vector in motion_val represents:

     * (4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2)

     * - encoding: unused

     * - decoding: Set by libavcodec.

     */

    uint8_t motion_subsample_log2;

    /**(音频)采样率     */

    int sample_rate;

    uint64_t channel_layout;

    int64_t best_effort_timestamp;

    int64_t pkt_pos;

    int64_t pkt_duration;

    AVDictionary *metadata;

    int decode_error_flags;

#define FF_DECODE_ERROR_INVALID_BITSTREAM   1

#define FF_DECODE_ERROR_MISSING_REFERENCE   2

    int64_t channels;

} AVFrame;

AVFrame结构体一般用于存储原始数据(即非压缩数据,例如对视频来说是YUVRGB,对音频来说是PCM),此外还包含了一些相关的信息。比如说,解码的时候存储了宏块类型表,QP表,运动矢量表等数据。编码的时候也存储了相关的数据。因此在使用FFMPEG进行码流分析的时候,AVFrame是一个很重要的结构体。

下面看几个主要变量的作用(在这里考虑解码的情况):

uint8_t *data[AV_NUM_DATA_POINTERS]:解码后原始数据(对视频来说是YUVRGB,对音频来说是PCM

int linesize[AV_NUM_DATA_POINTERS]data的大小

int width, height:视频帧宽和高(1920x1080,1280x720...

int nb_samples:音频的一个AVFrame中可能包含多个音频帧,在此标记包含了几个

int format:解码后原始数据类型(YUV420YUV422RGB24...

int key_frame:是否是关键帧

enum AVPictureType pict_type:帧类型(I,B,P...

AVRational sample_aspect_ratio:宽高比(16:94:3...

int64_t pts:显示时间戳

int coded_picture_number:编码帧序号

int display_picture_number:显示帧序号

int8_t *qscale_tableQP

uint8_t *mbskip_table:跳过宏块表

int16_t (*motion_val[2])[2]:运动矢量表

uint32_t *mb_type:宏块类型表

short *dct_coeffDCT系数,这个没有提取过

int8_t *ref_index[2]:运动估计参考帧列表(貌似H.264这种比较新的标准才会涉及到多参考帧)

int interlaced_frame:是否是隔行扫描

uint8_t motion_subsample_log2:一个宏块中的运动矢量采样个数,取log

其他的变量不再一一列举,源代码中都有详细的说明。在这里重点分析一下几个需要一定的理解的变量:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值