代码之家  ›  专栏  ›  技术社区  ›  Harit Vishwakarma

如何使用libavcodec在AAC-LC、AAC-HE-V1和AAC-HE-V2中编码音频?

  •  2
  • Harit Vishwakarma  · 技术社区  · 11 年前

    我正在尝试使用libavcodec/ffmpeg API在AAC-LC、AAC-HE-V1和AAC-HE-V2中对音频进行编码。

    但当我使用以下配置和API调用时,它会显示“无效的AAC配置文件”

    AVCodecContext *encoder_ctx;
    encoder_ctx->codec_id           =   AV_CODEC_ID_AAC;
    encoder_ctx->sample_fmt         =   AV_SAMPLE_FMT_S16; 
    encoder_ctx->profile            =   FF_PROFILE_AAC_HE;
    
    encoder = avcodec_find_encoder(encoder_ctx->codec_id);
    avcodec_open2(encoder_ctx, encoder, NULL);
    

    你能解释一下这个怎么了吗?

    3 回复  |  直到 11 年前
        1
  •  6
  •   Henry Malinowski Colin Thomsen    5 年前

    首先看看这个 document:

    杜比数码:ac3

    杜比数字加:eac3

    MP2:libtwolame,MP2

    Windows Media音频1:wmav1

    Windows Media音频2:wmav2

    LC-AAC:libfdk_AAC、libfaac、AAC、libvo_aacenc

    HE-AAC:libfdk_AAC、libaacplus

    沃尔比斯:libvorbis,沃尔比斯

    MP3:libmp3lame、libshine

    作品:libopus

    从上面的阅读中,你会清楚地看到,为了在HE-AAC/HE-AAC-V2中编码音频,你必须使用libfdk_AAC或libaacplus。

    我将解释如何使用libfdk_aac来实现这一点:

    首先,请确保配置ffmpeg以及以下选项:

    --enable-libfdk_aac --enable-nonfree
    

    现在构建ffmpeg,并尝试运行以下命令,看看它是否有效:

    ffmpeg -i <input file> -vcodec copy -acodec libfdk_aac -profile:a aac_he <output file>
    

    如果这样做有效,则意味着libav与libfdk_aac链接。

    现在为了在代码中使用它:

    按照以下说明打开编码器:

    AVCodecContext *encoder_ctx;
    encoder_ctx->codec_id           =   AV_CODEC_ID_AAC;
    encoder_ctx->sample_fmt         =   AV_SAMPLE_FMT_S16; 
    encoder_ctx->profile            =   FF_PROFILE_AAC_HE;
    
    encoder = avcodec_find_encoder_by_name("libfdk_aac");
    // if you still try to open it using avcodec_find_encoder it will open libfaac only.
    avcodec_open2(encoder_ctx, encoder, NULL);
    

    我们开始了,您已经打开了libfdk_aac编码器! 您可以使用的配置文件如下所示 source

        2
  •  2
  •   Bartek Zdanowski    3 年前

    除了使用--enable-libfdk_aac之外,您可能还必须使用

    --enable-encoder=libfdk_aac
    

    如果您选择并禁用了所有可用选项

    --disable-everything
    

    所以之后 配置 检查是否有外部lib:

    External libraries:
    libfdk_aac
    

    和编码器:

    Enabled encoders:
    libfdk_aac
    
        3
  •  0
  •   Roman Ryltsov    11 年前

    我想问题是这个编码器不支持AAC-HE。你可能想签入这个 source code 。支持的可能是:

    • FF_PROFILE_AAC_MAIN
    • FF_PROFILE_AAC_LOW
    • FF_PROFILE_AAC_SSR
    • FF_PROFILE_AAC_LTP

    您可能需要使用 libfdk_aac 编解码器,具有AAC-HE支持。