现在的位置: 首页 > 综合 > 正文

FFMPEG CODEC使用总结

2012年05月14日 ⁄ 综合 ⁄ 共 2183字 ⁄ 字号 评论关闭

ffmpeg里提供了很多的encoder,decoder,详见avcodec.h里的枚举变量CodecID。

 

宏定义

#define REGISTER_ENCODER(X,x) { /
          extern AVCodec x##_encoder; /
          if(##X##_ENCODER)  avcodec_register(&x##_encoder); }

 

#define REGISTER_DECODER(X,x) { /
     extern AVCodec x##_decoder; /
           if(##CODEC_ID_##X##)  avcodec_register(&x##_decoder); }

 

比如:

 REGISTER_DECODER (H264, h264);

就相当于extern AVCodec h264_decoder;

            if(CODEC_ID_H264)

            avcodec_register(&h264_decoder);

 

而这三行代码的实际作用就是:

           AVCodec codec;

           codec = &h264_decoder;

 

配置好codec之后,

定义全局变量AVCodecContext *avctx;

然后avctx->codec = codec;

 

后续就可以调用通用的API:

                     avctx->codec->init         初始化

                     avctx->codec->decode  解码

                  或avctx->codec->encode  编码

                     avctx->codec->close     关闭

实现编码或解码功能

 

codec是一个结构体,定义如下:

typedef struct AVCodec {
    const char *name;
    enum CodecType type;
    enum CodecID id;
    int priv_data_size;
    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, AVPacket *avpkt); //解码函数

对于不同的codec,这三个API对应的函数不同。

   对于CODEC_ID_H264,h264_decoder的定义为

 

AVCodec h264_decoder = {
    "h264",
    CODEC_TYPE_VIDEO,
    CODEC_ID_H264,
    sizeof(H264Context),
    decode_init,
    NULL,
    decode_end,
    decode_frame,

 }

对于CODEC_ID_H263,h263_decoder的定义如下:

 AVCodec h263_decoder = {
    "h263",
    CODEC_TYPE_VIDEO,
    CODEC_ID_H263,
    sizeof(MpegEncContext),
    ff_h263_decode_init,
    NULL,
    ff_h263_decode_end,
    ff_h263_decode_frame,
    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
  //  .flush= ff_mpeg_flush,
  //  .long_name= NULL_IF_CONFIG_SMALL("H.263 / H.263-1996, H.263+ / H.263-1998 / H.263 version 2"),
  //  .pix_fmts= ff_hwaccel_pixfmt_list_420,
};

 

对于CODEC_ID_MPEG4,mpeg4_decoder的定义如下:

AVCodec mpeg4_decoder = {
    "mpeg4",
    CODEC_TYPE_VIDEO,
    CODEC_ID_MPEG4,
    sizeof(MpegEncContext),
    ff_h263_decode_init,
    NULL,
    ff_h263_decode_end,
    ff_h263_decode_frame,
    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
//    .flush= ff_mpeg_flush,
//    .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2"),
//    .pix_fmts= ff_hwaccel_pixfmt_list_420,
};

 

【上篇】
【下篇】

抱歉!评论已关闭.