How to encode audio in AAC-LC, AAC-HE-V1, AAC-HE-V2 using libavcodec?

16,749

Solution 1

First of all have a look at this document:

Dolby Digital: 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

from the above reading it will be clear to you that in order to encode audio in HE-AAC/ HE-AAC-V2 you have to use libfdk_aac or libaacplus.

I will explain how you can do it using libfdk_aac:

first make sure you configure ffmpeg along with following options:

--enable-libfdk_aac --enable-nonfree

now build ffmpeg and try to run the following command and see if it works:

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

if this works it means libav is linked with libfdk_aac.

now in order to use it in the code:

open the encoder using the following instructions:

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);

Here we go, you have libfdk_aac encoder open ! The profiles which you can use are as given in this source

Solution 2

Besides using --enable-libfdk_aac you might also have to use

--enable-encoder=libfdk_aac

if you are selective and disabled all available options with

--disable-everything

So after configure check if you have external lib:

External libraries:
libfdk_aac

and encoder:

Enabled encoders:
libfdk_aac
Share:
16,749
Harit Vishwakarma
Author by

Harit Vishwakarma

Find out more here https://www.linkedin.com/in/harit7/

Updated on June 05, 2022

Comments

  • Harit Vishwakarma
    Harit Vishwakarma almost 2 years

    I am trying to encode audio in AAC-LC,AAC-HE-V1, AAC-HE-V2 using libavcodec/ffmpeg APIs.

    But when I am using the following configuration and API calls.It says "invalid AAC profile."

    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);
    

    Could you please explain what is wrong with this?