ffmpeg 找到编解码器,和编解码器上下文后,是如何初始化具体的编解码器的?aac 初始化流程大致如下

1.当使用 avcodec_find_encoder_by_name找到编码器的时候,
 const AVCodec *   aacencoder = avcodec_find_encoder_by_name("libx264");

编码器 有值的是:
id                        AV_CODEC_ID_H264 (27)
long_name         libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
name        libx264
pix_fmts        AV_PIX_FMT_YUV420P (0)

type        AVMEDIA_TYPE_VIDEO (0)


2.当调用     AVCodecContext *aacencodercontext = avcodec_alloc_context3(aacencoder); 后。
编码器中和上面一样,没有啥变化


编码器上下文里面有内容的是:
编码器上下文中的 codec_id 和 codec_type 是有值的,其他的都重新赋值了默认值
codec_id                AV_CODEC_ID_H264 (27)
codec_type            AVMEDIA_TYPE_VIDEO (0)
如下举例的默认值:

    s->time_base           = (AVRational){0,1};
    s->framerate           = (AVRational){ 0, 1 };
    s->pkt_timebase        = (AVRational){ 0, 1 };


3.当调用了 avcodec_open2(encoderAVCodecContext, encoderAVCodec, NULL) 方法后,很多参数就会被设置。

我们可以想象,假设encoder 是AAC ,那么哪些参数会被设置呢?
第一个就是一个 avframe 有多少个 样本帧,

3.1从最开始的avcodec_find_encoder 或者 avcodec_find_decoder开始看起。
方法在 D:\Ctool\yinshipin\ffmpeg-6.0source\libavcodec\allcodecs.c 文件中。


const AVCodec *avcodec_find_encoder(enum AVCodecID id)
{
    return find_codec(id, av_codec_is_encoder);
}

const AVCodec *avcodec_find_decoder(enum AVCodecID id)
{
    return find_codec(id, av_codec_is_decoder);
}


3.2 find_codec 方式 其核心是av_codec_iterate方法

static const AVCodec *find_codec(enum AVCodecID id, int (*x)(const AVCodec *))
{
    const AVCodec *p, *experimental = NULL;
    void *i = 0;

    id = remap_deprecated_codec_id(id);

    while ((p = av_codec_iterate(&i))) {
        if (!x(p))
            continue;
        if (p->id == id) {
            if (p->capabilities & AV_CODEC_CAP_EXPERIMENTAL && !experimental) {
                experimental = p;
            } else
                return p;
        }
    }

    return experimental;
}

3.3 av_codec_iterate 方法 实际是是从  codec_list 中找到对应的 codec,这个list很长,包括所有的 编码器 和 解码器 在ffmepg 内部的名字。
const AVCodec *av_codec_iterate(void **opaque)
{
    uintptr_t i = (uintptr_t)*opaque;
    const FFCodec *c = codec_list[i];

    ff_thread_once(&av_codec_static_init, av_codec_init_static);

    if (c) {
        *opaque = (void*)(i + 1);
        return &c->p;
    }
    return NULL;
}


我们可以看到,在 codec_list 对应的aac有多个,我们用 ff_aac_encoder 来说明。
在search 代码后,发现,ff_aac_encoder 的定义是在 aacenc.c 中,其中有


从 D:\Ctool\yinshipin\ffmpeg-6.0source\libavcodec\aacenc.c 中可以看到如下的信息,
字段 .init = aac_encode_init,应该是一个函数,
从 aac_encode_init 函数中可以看到,frame_size是1024
    avctx->frame_size = 1024;


const FFCodec ff_aac_encoder = {
    .p.name         = "aac",
    CODEC_LONG_NAME("AAC (Advanced Audio Coding)"),
    .p.type         = AVMEDIA_TYPE_AUDIO,
    .p.id           = AV_CODEC_ID_AAC,
    .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
                      AV_CODEC_CAP_SMALL_LAST_FRAME,
    .priv_data_size = sizeof(AACEncContext),
    .init           = aac_encode_init,
    FF_CODEC_ENCODE_CB(aac_encode_frame),
    .close          = aac_encode_end,
    .defaults       = aac_encode_defaults,
    .p.supported_samplerates = ff_mpeg4audio_sample_rates,
    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
    .p.sample_fmts  = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,
                                                     AV_SAMPLE_FMT_NONE },
    .p.priv_class   = &aacenc_class,
};

到这里,还有一个问题:ff_aac_encoder 是什么时候被初始化的呢?
实际上     ret = avcodec_open2(avcodecContext,nullptr,nullptr); 内部是做了这个事情的。
核心代码是在 

        if (codec2->init) {
        
        实际上就会调用到:
        static av_cold int aac_encode_init(AVCodecContext *avctx)

相关推荐

  1. 【BlossomRPC】解码器实现

    2024-07-12 05:00:05       34 阅读
  2. FFmpeg对H246进行解码实现

    2024-07-12 05:00:05       41 阅读
  3. 探索HiFi智能解码器奇妙世界

    2024-07-12 05:00:05       19 阅读
  4. Python——字节串bytes解码

    2024-07-12 05:00:05       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 05:00:05       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 05:00:05       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 05:00:05       58 阅读
  4. Python语言-面向对象

    2024-07-12 05:00:05       69 阅读

热门阅读

  1. 【问题记录】xxl-job admin端锁超时问题

    2024-07-12 05:00:05       25 阅读
  2. CNN -1 神经网络-概述2

    2024-07-12 05:00:05       25 阅读
  3. 使用 CSS 实现多列布局

    2024-07-12 05:00:05       21 阅读
  4. 【LeetCode】633. 平方数之和

    2024-07-12 05:00:05       20 阅读
  5. 深度优先算法-DFS(算法篇)

    2024-07-12 05:00:05       24 阅读
  6. C++ override关键字

    2024-07-12 05:00:05       24 阅读
  7. LeetCode 2974.最小数字游戏:排序+交换奇偶位

    2024-07-12 05:00:05       30 阅读
  8. 实现前端用户密码重置功能(有源码)

    2024-07-12 05:00:05       28 阅读
  9. [XCUITest] 处理iOS权限点击授权 有哪些权限?

    2024-07-12 05:00:05       23 阅读