Linux – Most efficient way to convert a large ALAC library to MP3

debianffmpeglamelinuxmp3

I have a large library of CDs ripped to alac which I use as my main music library. I'd like to convert a copy of this library to vbr mp3 for portable devices, however I don't want to have to do this on my laptop, as there is approximately 650Gb of music and I travel to much to leave my laptop sitting for the time it would require to convert my whole library. My friend has some server space (running Debian Squeeze) he is willing to lend me for a week or two to power through converting my library. What would be the best utility or way to go about this. For single songs or single albums I just use something like

#!/bin/sh
for file in "$@" ; do
name=`echo "$file" | sed -e "s/.mp4$//g"`
ffmpeg -i "$file" -ac 2 -f wav - | lame --preset standard - "$name.mp3"
done

I'm sure there is a much more efficient way to do this. My music is currently organised as "Artist – Albums – Tracks" and I would like the output to mirror this.

Best Answer

In the examples below, ~/Music/ is assumed as the source directory.


Create a convert.sh script:

$ cat > convert
#!/bin/bash
input=$1
output=${input#.*}.mp3
ffmpeg -i "$input" -ac 2 -f wav - | lame -V 2 - "$output"
[Ctrl-D]
$ chmod +x convert
  • If you want a different location to be used for the outputs, add this before ffmpeg:

    output=~/Converted/${output#~/Music/}
    mkdir -p "${output%/*}"
    

Convert using parallel from moreutils:

$ find ~/Music/ -type f -name '*.mp4' -print0 | xargs -0 parallel ./convert --

Not to be confused with GNU parallel, which uses a different syntax:

$ find ~/Music/ -type f -name '*.mp4' | parallel ./convert
Related Question