私はメインの音楽ライブラリとして使用しているalacにリッピングされたCDの大規模なライブラリを持っています。このライブラリのコピーをポータブルデバイス用のvbrmp3に変換したいのですが、ラップトップでこれを行う必要はありません。約650Gbの音楽があり、ラップトップを置いたままにするために多くの場所に移動します。しばらくの間、ライブラリ全体を変換する必要がありました。私の友人は(Debian Squeezeを実行している)サーバースペースを持っており、私のライブラリを変換することで電力を供給するために1、2週間貸してくれます。これを実行するための最良のユーティリティまたは方法は何でしょうか。シングルソングやシングルアルバムの場合、私は次のようなものを使用します
#!/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
これを行うにはもっと効率的な方法があると確信しています。私の音楽は現在「アーティスト-アルバム-トラック」として編成されており、これを反映した出力が必要です。
以下の例では、~/Music/
がソースディレクトリとして想定されています。
convert.sh
スクリプトを作成します。
$ 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
別の場所を出力に使用する場合は、ffmpeg
の前にこれを追加します。
output=~/Converted/${output#~/Music/}
mkdir -p "${output%/*}"
moreutilsからparallel
を使用して変換します。
$ find ~/Music/ -type f -name '*.mp4' -print0 | xargs -0 parallel ./convert --
異なる構文を使用するGNU parallel
と混同しないでください。
$ find ~/Music/ -type f -name '*.mp4' | parallel ./convert
GNU Parallelを使用すると、スクリプトも必要ありません。
find ~/Music/ -type f -name '*.mp4' | parallel ffmpeg -i {} -ac 2 -f wav - \| lame -V 2 - {.}.mp3
Ffmpegのバージョンがlibmp3lameを有効にしてコンパイルされていると仮定すると、lameを使用せずに同じことを実行できます(ほとんどのバージョンは有効です)。
find ~/Music/ -type f -name '*.mp4' | parallel ffmpeg -i {} -c:a libmp3lame -q:a 2 {.}.mp3
Findコマンドで-iname
の代わりに-name
を使用して、大文字と小文字を区別しない一致を取得することもできます(したがって、すべての* .mp4と* .MP4、およびすべての大文字と小文字のバリエーションが取得されます)。また、2番目のバージョンでは-ac 2
は厳密には必要ありません。 MP3はとにかく最大2チャンネルしかサポートできないので、ffmpegは必要に応じてオーディオを自動的に2チャンネルに変換します。これにより、モノラルオーディオに無意味なチャンネルを追加する必要がなくなります。
MP3のエンコードに関する基本的な情報については このffmpeg wikiページ を、より詳細な情報については このhydrogenaudioガイド を参照してください。
Sshできる他のマシンがある場合(たとえば、ラップトップは夜間に利用可能です)GNU ParallelはそれらのCPUも使用できます。-trcの例を見てください(転送するには)ファイル)および--retries(日中にラップトップが不在になっていることに対処するため) http://www.gnu.org/software/parallel/man.html#example__using_remote_computers を参照してください。
詳細については、紹介ビデオをご覧ください: http://www.youtube.com/watch?v=OpaiGYxkSuQ