AVCodec结构体是存储编解码器信息的结构体。该结构体位于codec.h中。分析一下结构体中里的每个变量的含义和作用,首先看一下结构体的定义:
1 | typedef struct AVCodec { |
来看一下结构体中几个重要的变量:
1 | const char *name; 编解码器的名称,较短 |
详细介绍几个变量:
\1. enum AVMediaType type
AVMediaType定义如下:
1 | enum AVMediaType { |
\2. enum AVCodecID codec_id
AVCodecID 定义如下:
1 | enum AVCodecID { |
\3. const enum AVPixelFormat *pix_fmts
AVPixelFormat的类型在我的上一篇文章已经给出,并且代码太多,这里就不在展示
\4. const enum AVSampleFormat *sample_fmts
enum AVSampleFormat定义如下:
1 | enum AVSampleFormat { |
每种解码器对应一个结构体,查看ffmpeg的源代码,我们看一下H.264解码器的结构体,该结构体位于h264dec.c 中:
1 | AVCodec ff_h264_decoder = { |
jpeg2000解码器结构体(jpeg2000dec.c)
1 | AVCodec ff_jpeg2000_decoder = { |
在AVCodec结构体中有一个变量为struct AVCodec *next,表明这些编解码器以链表的形式存储。遍历ffmpeg中的编解码器信息的方法:
\1. 注册所有的编解码器: av_register_all();
\2. 声明一个AVCodec类型的指针,
\3. 调用av_codec_next()函数,即可获得链表中下一个编解码器的指针,重复第三步即可获取所有编解码器的信息。如果想要获取第一个解码器的指针,需要将参数设置为NULL即可