FFMPEG: Convert m4a to mp3 without significant loss

audioaudio conversionffmpegm4amp3

I have a load of audio files (about 1000) which I want to convert from m4a to mp3 so I can use play them on a CD player which has a USB port.

I tried doing something simple like: ffmpeg -i FILE.m4a FILE.mp3 but this seems to reduce the bitrate to a very low value, which isn't what I want.

Similarly I don't want to convert using a constant bitrate, such as 320k, because some of the files I am converting are 320k m4a's and some are as low quality as 96k m4a's.

It seems to make no sense to force 320k, since some files will become many times larger than they need be. Similarly it makes no sense to destroy all my 320k files by converting them to something much lower than 96k. (At the moment, the files are being converted to about 50k.)

Does anyone know how I can do this? What I really want to do is tell ffmpeg to convert all m4a files in a directory into mp3's while retaining the current audio quality as best it can. (Of course there is likely to be some extra losses from converting from lossy to lossy file formats.)

Thanks for your help. If this isn't possible, is there some sort of script which might detect the required quality as it converts files individually?

PS: I am working on an intel Mac, but also have a Ubuntu box.

Best Answer

Use Variable Bit Rate (VBR)

You can use the -q:a option in ffmpeg to create a variable bitrate (VBR) MP3 output:

ffmpeg -i input.m4a -c:v copy -c:a libmp3lame -q:a 4 output.mp3

What -q:a values to use

From FFmpeg Wiki: MP3:

Control quality with -q:a (or the alias -qscale:a). Values are encoder specific, so for libmp3lame the range is 0-9 where a lower value is a higher quality.

  • 0-3 will normally produce transparent results
  • 4 (default) should be close to perceptual transparency
  • 6 usually produces an "acceptable" quality.

The option -q:a is mapped to the -V option in the standalone lame command-line interface tool.

You'll have to experiment to see what value is acceptable for you. Also see Hydrogen Audio: Recommended LAME Encoder Settings.

Encoding multiple files

In Linux and macOS you can use a Bash "for loop" to encode all files in a directory:

$ mkdir newfiles
$ for f in *.m4a; do ffmpeg -i "$f" -codec:v copy -codec:a libmp3lame -q:a 2 newfiles/"${f%.m4a}.mp3"; done