wiki:

Encode

/

AAC

Advanced Audio Coding (AAC) is the successor format to MP3, and is defined in MPEG-4 part 3 (ISO/IEC 14496-3). It is often used within an MP4 container format; for music the .m4a extension is customarily used. The second-most common use is within MKV (Matroska) files because it has better support for embedded text-based soft subtitles than MP4. The examples in this guide will use the extensions MP4 and M4A.

FFmpeg can support three AAC-LC encoders (aac, libfaac, libfdk_aac) and one HE-AAC(v1/2) encoder (libfdk_aac). The licenses of libfaac and libfdk_aac are not compatible with the GPL, so the GPL does not permit distribution of binaries containing code licensed under these licenses when GPL-licensed code is also included. Therefore these encoders have been designated as "non-free", and you cannot download a pre-built ffmpeg that supports them. This can be resolved by compiling ffmpeg yourself.

See also Encode/HighQualityAudio for general guidelines on FFmpeg audio encoding (which also includes a comparison of which AAC encoder is best quality).


libfdk_aac

The Fraunhofer FDK AAC codec library. This is currently the highest-quality AAC encoder available with ffmpeg. Requires ffmpeg to be configured with --enable-libfdk-aac (and additionally --enable-nonfree if you're also using --enable-gpl). But beware, it defaults to a low-pass filter of around 14kHz (details). If you want to preserve higher frequencies, use -cutoff 18000. Adjust the number to the upper frequency limit you prefer.

Detailed information about the FDK AAC library (not FFmpeg specific) can be found at HydrogenAudio Knowledgebase: Fraunhofer FDK AAC.

Constant Bit Rate (CBR) mode

These settings target a specific bit rate, with less variation between samples. It gives you greater control over file size, and it is compatible with the HE-AAC profile. As a rule of thumb, for audible transparency, use 64kb/s for each channel (so 128kb/s for stereo, 384 kb/s for 5.1 surround sound). Set the bit rate with the -b:a option.

Examples

Convert and audio file to AAC in an M4A (MP4) container:

ffmpeg -i input.wav -c:a libfdk_aac -b:a 128k output.m4a

Convert 5.1 surround sound audio of a video, leaving the video alone:

ffmpeg -i input.mp4 -c:v copy -c:a libfdk_aac -b:a 384k output.mp4

Convert the video with libx264, with a target of fitting a 90-minute movie on a 700MB(=5734400kb) CD-ROM, mixing the audio down to two channels (Windows users should use NUL rather than /dev/null):

ffmpeg -y -i input.mp4 -c:v libx264 -b:v 933k -preset:v veryfast -pass 1 -an /dev/null && \
ffmpeg -i input.mp4 -c:v libx264 -b:v 933k -preset:v veryfast -pass 2 \
-ac 2 -c:a libfdk_aac -b:a 128k output.mp4

Variable Bit Rate (VBR) mode

Target a quality, rather than a specific bit rate. 1 is lowest quality and 5 is highest quality. Set the VBR level with the -vbr flag.

Note: A bug exists in libfdk-aac 0.1.3 and earlier that will cause a crash when using high sample rates, such as 96kHz, with VBR mode 5. (details).

VBR modes gives roughly the following bit rates per channel (details):

VBRkbps/channelAOTs
120-32LC,HE,HEv2
232-40LC,HE,HEv2
348-56LC,HE,HEv2
464-72LC
596-112LC

HE bit rates will be much lower.

Examples

Convert an audio file to AAC in an M4A (MP4) container:

ffmpeg -i input.wav -c:a libfdk_aac -vbr 3 output.m4a

Convert the audio only of a video:

ffmpeg -i input.mp4 -c:v copy -c:a libfdk_aac -vbr 3 output.mp4

Convert the video with libx264, and mix down audio to two channels:

ffmpeg -i input.mp4 -c:v libx264 -crf 22 -preset:v veryfast \
-ac 2 -c:a libfdk_aac -vbr 3 output.mp4

High-Efficiency AAC

This is a pair of AAC profiles tailored for low bit rates (version 1 and version 2). HE-AAC version 1 is suited for bit rates below 64kb/s (for stereo audio) down to about 48 kb/s, while HE-AAC version 2 is suited for bit rates as low as 32 kb/s (again, for stereo).

Note: HE-AAC version 2 only handles stereo. If you have mono, or want to down-mix to mono, use HE-AAC version 1.

Unfortunately, many devices that can play AAC-LC (the default profile for libfdk_aac) simply cannot play either version of HE-AAC, so this is not recommended for surround sound audio, which normally needs to be compatible with such hardware players. If you are only going to play it on your computer, or you are sure that your hardware player supports HE-AAC, you can aim for a bit rate of 160kb/s for version 1, or 128kb/s for version 2. As always, experiment to see what works for your ears.

HE-AAC version 1

ffmpeg -i input.wav -c:a libfdk_aac -profile:a aac_he -b:a 64k output.m4a

HE-AAC version 2

ffmpeg -i input.wav -c:a libfdk_aac -profile:a aac_he_v2 -b:a 32k output.m4a

Native FFmpeg AAC encoder

The native FFmpeg AAC encoder. This is currently the second highest-quality AAC encoder available in FFmpeg and does not require an external library like the other AAC encoders described here. This is the default AAC encoder.

Note: -strict experimental (or -strict -2) was previously required for this encoder, but it is no longer experimental and these options are unnecessary since 5 December 2015.

Example using -b:a

ffmpeg -i input.wav -c:a aac -b:a 160k output.m4a

Example using -q:a

ffmpeg -i input.wav -c:a aac -q:a 2 output.m4a

Effective range for -q:a is around 0.1-2. This VBR is experimental and likely to get even worse results than the CBR.


libfaac

Freeware Advanced Audio Coder. Requires ffmpeg configuration with --enable-libfaac --enable-nonfree. Note that you will not get as good results as with libfdk_aac.

Variable Bit Rate (VBR) Example

ffmpeg -i input.wav -c:a libfaac -q:a 100 output.m4a

Range for -q:a is 10-500 and is similar to using the -q option in standalone faac. 100 is a good value to try.

Average Bit Rate (ABR) Example

ffmpeg -i input.wav -c:a libfaac -b:a 192k output.m4a

libfaac does not support a true Constant Bit Rate (CBR) mode.


Deprecated/removed encoders

libvo_aacenc

VisualOn AAC encoding library. Support for this library has been removed. Use the native FFmpeg encoder instead: it provides better quality and supports more than 2 channels.


libaacplus

AAC+ encoding library. Support for this library has been removed. Use libfdk_aac instead for HE-AAC: it is consistently better in all bitrates.


Metadata

You can add metadata to any of the examples on this guide:

ffmpeg -i input ... -metadata author="FFmpeg Bayou Jug Band" -metadata title="Decode my Heart (Let's Mux)" output.mp4

Progressive download

By default the MP4 muxer writes the 'moov' atom after the audio stream ('mdat' atom) at the end of the file. This results in the user requiring to download the file completely before playback can occur. Relocating this moov atom to the beginning of the file can facilitate playback before the file is completely downloaded by the client.

You can do this with the -movflags +faststart option:

ffmpeg -i input.wav -c:a libfdk_aac -movflags +faststart output.m4a

You can also use this option on existing MP4/M4A files. Since the audio is simply being stream copied there is no re-encoding occurring, just re-muxing, so therefore there is no quality loss:

ffmpeg -i input.m4a -c:a copy -movflags +faststart output.m4a

FAQ

Which encoder provides the best quality?

For AAC-LC the likely answer is: libfdk_aac > Native FFmpeg AAC encoder (aac) > libfaac.

For HE-AAC you have one choice: libfdk_aac.

Should I use AAC-LC or HE-AAC?

If you require a low audio bitrate, such as ≤ 32kbs/channel, then HE-AAC would be worth considering if your player or device can support HE-AAC decoding. Anything higher may benefit more from AAC-LC due to less processing. If in doubt use AAC-LC. All players supporting HE-AAC also support AAC-LC.


Also See

Last modified 3 months ago Last modified on Feb 18, 2016, 10:07:52 AM

Attachments (5)