FFmpeg数据结构AVFrame

 本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10404502.html


本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10404502.html

本文基于FFmpeg 4.1版本。

1. 数据结构定义

struct AVFrame定义于<libavutil/frame.h>

struct AVFrame frame;

AVFrame中存储的是经过解码后的原始数据。在解码中,AVFrame是解码器的输出;在编码中,AVFrame是编码器的输入。下图中,“decoded frames”的数据类型就是AVFrame:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16  _______              ______________ |       |            |              | | input |  demuxer   | encoded data |   decoder | file  | ---------> | packets      | -----+ |_______|            |______________|      |                                            v                                        _________                                       |         |                                       | decoded |                                       | frames  |                                       |_________|  ________             ______________       | |        |           |              |      | | output | <-------- | encoded data | <----+ | file   |   muxer   | packets      |   encoder |________|           |______________| 

AVFrame数据结构非常重要,它的成员非常多,导致数据结构定义篇幅很长。下面引用的数据结构定义中省略冗长的注释以及大部分成员,先总体说明AVFrame的用法,然后再将一些重要成员摘录出来单独进行说明:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 /**  * This structure describes decoded (raw) audio or video data.  *  * AVFrame must be allocated using av_frame_alloc(). Note that this only  * allocates the AVFrame itself, the buffers for the data must be managed  * through other means (see below).  * AVFrame must be freed with av_frame_free().  *  * AVFrame is typically allocated once and then reused multiple times to hold  * different data (e.g. a single AVFrame to hold frames received from a  * decoder). In such a case, av_frame_unref() will free any references held by  * the frame and reset it to its original clean state before it  * is reused again.  *  * The data described by an AVFrame is usually reference counted through the  * AVBuffer API. The underlying buffer references are stored in AVFrame.buf /  * AVFrame.extended_buf. An AVFrame is considered to be reference counted if at  * least one reference is set, i.e. if AVFrame.buf[0] != NULL. In such a case,  * every single data plane must be contained in one of the buffers in  * AVFrame.buf or AVFrame.extended_buf.  * There may be a single buffer for all the data, or one separate buffer for  * each plane, or anything in between.  *  * sizeof(AVFrame) is not a part of the public ABI, so new fields may be added  * to the end with a minor bump.  *  * Fields can be accessed through AVOptions, the name string used, matches the  * C structure field name for fields accessible through AVOptions. The AVClass  * for AVFrame can be obtained from avcodec_get_frame_class()  */ typedef struct AVFrame {     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;     enum AVPictureType pict_type;     AVRational sample_aspect_ratio;     int64_t pts;     ...... } AVFrame;

AVFrame的用法:

  1. AVFrame对象必须调用av_frame_alloc()在堆上分配,注意此处指的是AVFrame对象本身,AVFrame对象必须调用av_frame_free()进行销毁。
  2. AVFrame中包含的数据缓冲区是
  3. AVFrame通常只需分配一次,然后可以多次重用,每次重用前应调用av_frame_unref()将frame复位到原始的干净可用的状态。

下面将一些重要的成员摘录出来进行说明:
data


                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信