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.

link|improve this question

How many CPUs/cores does the server have? (LAME only supports single-threaded encoding, but on quad-core you could encode four songs at once.) – grawity Sep 25 '11 at 15:50
I have 4 CPU cores available on the server for transcoding. – Leda Sep 25 '11 at 16:38
feedback

2 Answers

up vote 2 down vote accepted

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
link|improve this answer
feedback

With GNU Parallel you do not even need the script:

$ find ~/Music/ -type f -name '*.mp4' | parallel ffmpeg -i {} -ac 2 -f wav - \| lame -V 2 - {.}.mp3

Also if you have other machines that you can ssh to (e.g. maybe your laptop is available during the nights) GNU Parallel can use those CPUs, too. Look at the examples of --trc (to transfer the files) and --retries (to deal with the laptop being away during the day). See http://www.gnu.org/software/parallel/man.html#example__using_remote_computers

Watch the intro videos to learn more: http://www.youtube.com/watch?v=OpaiGYxkSuQ

link|improve this answer
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.