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.
Fraunhofer CBR@256 and VBR@5 have very similar spectrums when specifying the cut-off frequency manually. However, the ffmpeg documentation notes that this can audibly reduce audio quality (emphasis mine):
If you follow this advice and retain the default cut-off frequency (17kHz for CBR, disabled for VBR 5), then VBR 5 has a clear advantage in this regard (in fact, I don't think there's any way the cutoff can be disabled for CBR, so VBR 5 should also have an advantage over CBR@256k as well). Of course, it all boils down to the perceived quality in the end, and in that respect my advice is to err on the side of caution and follow the settings that have performed better in blind tests.
Strangely, your spek results seem inconsistent with mine. Your result for VBR 5 when not specifying a cutoff seems to have a clear cutoff at 19kHz, which I don't see in my own results. There's still some slight loss of volume in VBR, but I expected that to be the case based on my (rudimentary) understanding of how audio compression works.