Run:
ffmpeg -hide_banner -h encoder=libfdk_aac
If you have an FFmpeg version that does not include libfdk_aac, you will see this:
Codec 'libfdk_aac' is not recognized by FFmpeg.
If you have a build that includes libfdk_aac you will see this:
Encoder libfdk_aac [Fraunhofer FDK AAC]:
General capabilities: delay small
Threading capabilities: none
Supported sample rates: 96000 88200 64000 48000 44100 32000 24000 22050 16000 12000 11025 8000
Supported sample formats: s16
Supported channel layouts: mono stereo 3.0 4.0 5.0 5.1 7.1(wide) 7.1
libfdk_aac AVOptions:
-afterburner <int> E...A...... Afterburner (improved quality) (from 0 to 1) (default 1)
-eld_sbr <int> E...A...... Enable SBR for ELD (for SBR in other configurations, use the -profile parameter) (from 0 to 1) (default 0)
-eld_v2 <int> E...A...... Enable ELDv2 (LD-MPS extension for ELD stereo signals) (from 0 to 1) (default 0)
-signaling <int> E...A...... SBR/PS signaling style (from -1 to 2) (default default)
default -1 E...A...... Choose signaling implicitly (explicit hierarchical by default, implicit if global header is disabled)
implicit 0 E...A...... Implicit backwards compatible signaling
explicit_sbr 1 E...A...... Explicit SBR, implicit PS signaling
explicit_hierarchical 2 E...A...... Explicit hierarchical signaling
-latm <int> E...A...... Output LATM/LOAS encapsulated data (from 0 to 1) (default 0)
-header_period <int> E...A...... StreamMuxConfig and PCE repetition period (in frames) (from 0 to 65535) (default 0)
-vbr <int> E...A...... VBR mode (1-5) (from 0 to 5) (default 0)
FFmpeg supports two AAC-LC encoders (aac and libfdk_aac) and one HE-AAC (v1/2) encoder (libfdk_aac). The license of libfdk_aac is not compatible with GPL, so the GPL does not permit distribution of binaries containing incompatible code when GPL-licensed code is also included. Therefore this encoder have been designated as "non-free", and you cannot download a pre-built ffmpeg that supports it. This can be resolved by compiling ffmpeg yourself.
I setup a clean install of Windows 10 in a VM and run https://github.com/m-ab-s/media-autobuild_suite
ffmpeg -i input.wav -ac 2 -c:a libfdk_aac -cutoff 20000 -afterburner 1 -vbr 0 output.m4a
-ac 2
Downmix to a stereo track
-c:a libfdk_aac
Use Fraunhofer FDK AAC (libfdk_aac).
-cutoff 20000
libfdk_aac defaults to a low-pass filter of around 14kHz. 20000 is the maximum available.
-afterburner 1
Afterburner is "a type of analysis by synthesis algorithm which increases the audio quality but also the required processing power." Fraunhofer recommends to always activate this feature. 1
= On and 0
= Off.
-vbr 0
- Setting VBR (variable bitrate) to 0 means libfdk_aac will try to set the maximum available CBR (constant bitrate) for the stream. This results in the best theoretical quality no matter if you choose VBR or CBR. This will increase the filesize though.
Do you have a source on this? I'm more than willing to be proved wrong, but based on the Hydrogen Audio Wiki (emphasis theirs):
In addition, using
-vbr 5
disables the cutoff (source), potentially preserving more of the sound. Based on my own tests, this seems to check out; using-vbr 0
(without manually specifying a bitrate with-b:a
) tends to yield a bitrate around half that of-vbr 5
, and seems to give the same bitrate regardless of the chosen cutoff (and in fact the ffmpeg docs warn against increasing the cutoff for this reason, as it can audibly reduce audio quality (source), presumably because you're cramming a larger frequency range into the same amount of data). Using VBR gives a much higher bitrate (closer to the CBR bitrate I would associate with "perceptually lossless") and preserves some of the high-frequency information above 20kHz which was lost in the CBR encoding following your settings.Unless you have a specific need for CBR (compatibility, for example), I think using
-vbr 5
is the best option to preserve quality. If you do want to use CBR, I would suggest specifying a bitrate yourself (as a general rule of thumb,-b:a 256k
can often be considered "perceptually lossless", but can give you some pretty large files). That said, I may be wrong, and if you disagree or can point to some documentation somewhere that contradicts what I've found, I'd love to hear your thoughts on the matter.