ffmpeg基础知识二

常用库:

avcodec:编解码(最重要的库)

avformat:封装格式处理

avfilter:滤镜特效处理

avdevice:各种设备的输入输出

avutil:工具库(大部分库都需要该库支持)

postproc:后加工

swresample:音频采样数据格式转换

swscale:视频像素数据格式转换

 

常用数据结构:

AVFormatContext:

typedef struct AVFormatContext
{
    //指向 AVInputFormat,如对于 mp4 或 mov 为 ff_mov_demuxer
    struct AVInputFormat *iformat;
    /**
     * The output container format.
     *
     * Muxing only, must be set by the caller before avformat_write_header().
     */
    struct AVOutputFormat *oformat;
    // 指向具体的格式对应的 Context,如:MovContext。
    void *priv_data;
    //指向数据读取统一接口 context
    ByteIOContext pb;
    //流的数目
    int nb_streams;
    //至少 2 个指针元素分别指向 video stream 和 audio stream
    AVStream *streams[MAX_STREAMS];
} AVFormatContext;

AVFormatContext结构表示程序运行的当前文件容器格式所使用的上下文,着重于所有文件容器共有的属性(并且是在
程序运行时才能确定其值)和关联其他结构的字段。priv_data 字段关联各个具体文件容器独有的属性上下文,和 priv_data_size 配对使用

struct AVInputFormat *iformat:输入数据的封装格式

struct AVOutputFormat *oformat:输出数据的封装格式

AVIOContext *pb:输入数据的缓存

unsigned int nb_streams:视音频流的个数

AVStream **streams:视音频流

char filename[1024]:文件名

int64_t duration:时长(单位:微秒us,转换为秒需要除以1000000)

int bit_rate:比特率(单位bps,转换为kbps需要除以1000)

AVDictionary *metadata:元数据

AVOutputFormat:

AVOutputFormat 结构主要包含的信息有:封装名称描述,编码格式信息(video/audio 默认编码格式,支持的编码格式列表),一些对封装的操作函数(write_header,write_packet,write_tailer等)。其中,AVOutputFormat没有实现AVClass接口,但它保存了一个AVClass接口,具体怎样被使用则由后续决定。例如:MOV类的AVOutputFormat封装保存的是 针对 MOVMuxContext 结构的 AVClass 接口实现。

typedef struct AVOutputFormat {
    const char *name;
    /**
     * Descriptive name for the format, meant to be more human-readable
     * than name. You should use the NULL_IF_CONFIG_SMALL() macro
     * to define it.
     */
    //编码格式信息(video/audio 默认编码格式,支持的编码格式列表)
    enum AVCodecID audio_codec;    /**< default audio codec */
    enum AVCodecID video_codec;    /**< default video codec */
    enum AVCodecID subtitle_codec; /**< default subtitle codec */

} AVOutputFormat;

AVInputFormat:

AVInputFormat是类似COM接口的数据结构,表示输入文件容器格式,着重于功能函数,一种文件容器格式对应一个AVInputFOrmat结构,在程序运行时有多个实例,next变量用于把所有支持的输入文件容器格式连接成链表,便于便利查找,priv_data_size标示具体的文件容器格式对应的Context大小

typedef struct AVInputFormat
{
    // 标示 format 的名字, 比如,“mov” “mp4” 等。
    const char *name;
    // 标示具体的 format 对应的 Context 的 size,如:MovContext。
    int priv_data_size;
    //具体的操作函数
    int(*read_probe)(AVProbeData*);
    int(*read_header)(struct AVFormatContext *,AVFormatParameters *ap);
    int(*read_packet)(struct AVFormatContext *, AVPacket *pkt);
    int(*read_close)(struct AVFormatContext*);
    struct AVInputFormat *next;
} AVInputFormat;

AVCodecContext:

AVCodecContext结构表示程序运行的当前Codec的上下文,着重于当前所有Codec共有的属性(并且是在程序运行时才能确定其值)和关联其他结构的字段。extradata 和 extradata_size 两个字段表述了相应 Codec 使用的私有数据;codec 字段关联相应的编解码器;priv_data 字段关联各个具体编解码器独有的属性 context,和 AVCodec 结构中的 priv_data_size 配对使用

typedef struct AVCodecContext
{
    int bit_rate;
    int frame_number;
    //扩展数据,如 mov 格式中 audio trak 中 aac 格式中 esds 的附加解码信息。
    unsigned char *extradata;
    //扩展数据的 size
    int extradata_size;
    //视频的原始的宽度与高度
    int width, height; // 此逻辑段仅针对视频
    //视频一帧图像的格式,如 YUV420
    enum PixelFormat pix_fmt;
    //音频的采样率
    int sample_rate;
    //音频的声道的数目
    int channels;
    int bits_per_sample;
    int block_align;
    // 指向相应的解码器,如:ff_h264_decoder
    struct AVCodec *codec;
    //指向具体相应的解码器的 context,如 H264Context
    void *priv_data;
    //公共操作函数
    int(*get_buffer)(struct AVCodecContext *c, AVFrame *pic);
    void(*release_buffer)(struct AVCodecContext *c, AVFrame *pic);
    int(*reget_buffer)(struct AVCodecContext *c, AVFrame *pic);
}AVCodecContext;

AVCodec:

AVCodec是类似COM接口的数据结构,表示音视频编解码器,着重于功能函数,一种媒体类型对应一个AVCodec结构,在程序运行时有多个实例。next 变量用于把所有支持的编解码器连接成链表,便于遍历查找;id 确定了 唯 一编 解 码器 ; priv_data_size 表示具 体 的 Codec 对应的 Context 结构大 小

typedef struct AVCodec
{
    // 标示 Codec 的名字, 比如,"h264" "h263" 等。
    const char *name;
    // 标示 Codec 的类型,有 video ,audio 等类型。
    enum CodecType type;
    // 标示 Codec 的 ID,有 CODEC_ID_H264 等。
    enum CodecID id;
    // 标示具体的 Codec 对应的 Context 的 size,如:H264Context。
    int priv_data_size;
    // 以下标示 Codec 对外提供的操作,每一种解码器都会实现这些操作。
    int(*init)(AVCodecContext*);
    int(*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data);
    int(*close)(AVCodecContext*);
    int(*decode)(AVCodecContext *, void *outdata, int *outdata_size, uint8_t *buf, int                     
    buf_size);
    struct AVCodec *next;
}AVCodec;

AVStream:

AVStream结构表示当前媒体流的上下文,着重于所有媒体流共有的属性(并且是在程序运行时才能确定其值)和关联其他结构的字段,actx字段关联当前音视频媒体所使用的编解码器的context;priv_data 字段关联解析各个具体媒体流解复用拆包用的ontext;还有关键帧的索引表也存于此

typedef struct AVStream
{
    //指向解码器 context,用于关联解码器
    AVCodecContext *actx;
    //codec 解析器,每一种编码器在进行压缩时都会对实际负载数据进行封装,加//入头信息,如 h264,需    
    //要解析 nal单元,关联通过 avav_find_stream_info()
    struct AVCodecParserContext *parser;
    //指向解复用的流的 context,比如 mp4 的 MovStreamcontext
    void *priv_data;
    AVRational time_base;
    //用于 seek 时使用,用于快速索引关键帧,如 flv 的 keyframes 索引表和 mp4 的 I
    //帧的索引表都存于此,很重要
    AVIndexEntry *index_entries;
    //index_entries 的元素的个数
    int nb_index_entries;
    int index_entries_allocated_size;
    double frame_last_delay;
} AVStream;

AVPacket:

AVPacket 代表音视频数据帧,固有的属性是一些标记,时钟信息,和压缩数据首地址,大小等信息

typedef struct AVPacket
{
    //显示时间戳
    int64_t pts;
    //解码时间戳
    int64_t dts;
    //记录在文件或网络中的流中的字节的位置
    int64_t pos;
    //实际数据指针
    uint8_t *data;
    //实际的数据的大小
    int size;
    //该 packet 所属的流的索引,一般为 0 或者 1
    int stream_index;
    int flags;
    //析构函数
    void(*destruct)(struct AVPacket*);
} AVPacket;

AVFrame:

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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值