wiki:

Encode

/

HighQualityAudio


Version 26 (modified by lithosza, 5 years ago) (diff)

--

Guidelines for high quality lossy audio encoding

This guide is meant to help people new to encoding lossy audio to use the correct encoders and settings.

When should I transcode audio?

Avoid transcoding from lossy to lossy if possible. Transcode to lossy from the lossless source (if you have it) or just don't transcode by copying the lossy source audio track.

Generation loss

Transcoding from a lossy format like MP3, AAC, Vorbis, Opus, WMA, etc. to the same or different lossy format might degrade the audio quality even if the bitrate stays the same (or higher). This quality degradation might not be audible to you but it might be audible to others.
This post on hydrogenaudio.org demonstrates what will happen if you re-encode a file 100 times: http://www.hydrogenaudio.org/forums/index.php?showtopic=100067

Copying audio tracks

If the target container format supports the audio codec of the source file then really consider just muxing it into the output file. MKV supports virtually any audio codec.
This can be achieved by specifying 'copy' as the audio codec. Example:
Transcoding a WebM file (with VP8 video/Vorbis audio) to a MKV file (with H.264 video/unaltered Vorbis audio):

ffmpeg -i someFile.webm -c:a copy -c:v libx264 outFile.mkv

In some cases this might not be possible, because the target device/player doesn't support the codec or the target container format doesn't support the codec.
Another reason to transcode might be that the source audio track is too big. (It has a higher bitrate than what you want to use in the output file)

Audio encoders ffmpeg can use

ffmpeg can encode to a wide variety of lossy audio formats.

Here are some popular lossy formats with encoders listed that ffmpeg can use:

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

Based on quality produced from high to low:

libopus >= libfdk_aac >= libvorbis >= libmp3lame > eac3/ac3 > libfaac > libtwolame >= aac > mp2 > vorbis > wmav2/wmav1 > libvo_aacenc 

The >= sign means greater or the same quality.
Even though AAC should generally give better quality than MP3 at the same bitrates libmp3lame should give better quality output than libfaac.
This list is just a general idea and there might be cases where codecs listed to the right might perform better than those listed to the left at certain bitrates.
The highest quality internal/native encoder available in ffmpeg without any external libraries is eac3/ac3.

Please note it is not recommended to use vorbis for Vorbis encoding.
Please note that wmav1,wmav2 and libvo_aacenc don't seem to be able to reach transparency at any given bitrate.

Container formats

Only certain audio codecs will be able to fit in your target output file.

ContainerAudio formats supported
MKV/MKAVorbis, MP2, MP3, LC-AAC, HE-AAC, WMAv1, WMAv2, AC3, eAC3, Opus*
MP4/M4AMP2, MP3, LC-AAC, HE-AAC, AC3
FLV/F4VMP3, LC-AAC, HE-AAC
3GP/3G2LC-AAC, HE-AAC
MPGMP2, MP3
PS/TS StreamMP2, MP3, LC-AAC, HE-AAC, AC3
M2TSAC3, eAC3
VOBMP2, AC3
RMVBVorbis, HE-AAC
WebMVorbis
OGGVorbis, Opus

Please note that there are more container formats available than those listed above.

Recommended minimum bitrates to use

Please note that the bitrates listed here assumes the input audio channels is Stereo and the sample rate is >= 44.1Khz. Mono could require less bits.

  • libopus Usable range >= 64Kbps. Recommended range >= 128Kbps
  • libfdk_aac default LC-AAC profile. Recommended range (VBR level 3 to 5) or >= 128Kbps (http://ffmpeg.org/trac/ffmpeg/wiki/AACEncodingGuide).
  • (libfdk_aac or libaacplus) -profile:a aac_he_v2 Usable range <= 48Kbps CBR. Transparency: Does not reach transparency. Use LC-AAC instead to achieve transparency
  • (libfdk_aac or libaacplus) -profile:a aac_he Usable range >= 48Kbps and <= 80Kbps CBR. Transparency: Does not reach transparency. Use LC-AAC instead to achieve transparency
  • libvorbis Usable range >= 96Kbps. Recommended range -aq 4 (>= 128Kbps)
  • libmp3lame Usable range >= 128Kbps. Recommended range -aq 3 (>= 160Kbps)
  • ac3 or eac3 Usable range >= 128kbps. Recommended range >= 160Kbps
  • libfaac Usable range >= 192kbps. Recommended range -q:a 330 -cutoff 15000 (>= 192Kbps).

Example of usage:

ffmpeg -i input.wav -c:a libfaac -q:a 330 -cutoff 15000 output.m4a
  • libtwolame Usable range >= 192kbps. Recommended range >= 256Kbps
  • aac Usable range >= 256kbps. Recommended range -cutoff 15000 >= 256Kbps

Example of usage:

ffmpeg -i input.wav -c:a aac -b:a 256k -strict -2 -cutoff 15000 output.m4a
  • mp2 Usable range >= 320kbps. Recommended range >= 320Kbps

The vorbis, wmav1/wmav2 and libvo_aacenc encoders are not worth using.
The wmav1/wmav2 and libvo_aacenc encoders do not reach transparency at any bitrate.
The vorbis encoder does not use the bitrate specified in ffmpeg. On some samples it does sound reasonable, but the bitrate is very high.


  • Muxing Opus in Matroska is experimental, but may be safe.

When compatibility with hardware players doesn't matter then use libvorbis in a MKV container rather than libfaac when libfdk_aac isn't available
When compatibility with hardware players does matter then use libmp3lame or ac3 in a MP4/MKV container rather than libfaac when libfdk_aac isn't available
Transparency means the encoded audio sounds indistinguishable from the audio in the source file.