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

时间:2013-09-19 12:36:47

标签: audio ffmpeg libavcodec transcoding libav

我正在尝试使用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 个答案:

答案 0 :(得分:2)

首先来看看这个 document:

杜比数字:ac3

Dolby Digital Plus:eac3

MP2:libtwolame,mp2

Windows Media Audio 1:wmav1

Windows Media Audio 2:wmav2

LC-AAC:libfdk_aac,libfaac,aac,libvo_aacenc

HE-AAC:libfdk_aac,libaacplus

Vorbis:libvorbis,vorbis

MP3:libmp3lame,libshine

Opus: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

中所示

答案 1 :(得分:1)

除了使用--enable-libfdk_aac,您可能还需要使用

--enable-encoder=libfdk_aac

如果您有选择性并使用

禁用所有可用选项
--disable-everything

所以在 configure 之后检查你是否有外部库:

External libraries:
libfdk_aac

和编码器:

Enabled encoders:
libfdk_aac

答案 2 :(得分:0)

我想问题是这个编码器不支持AAC-HE。您可能需要在source code中查看此内容。支持可能是:

  • FF_PROFILE_AAC_MAIN
  • FF_PROFILE_AAC_LOW
  • FF_PROFILE_AAC_SSR
  • FF_PROFILE_AAC_LTP

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