月曜日, 4月 27, 2020

ffmpegで楽曲の一括変換するワンライナ

PCではFLACで再生できるけどモバイルやウォークマンでは大体MP3じゃないと無理なので、FLACデータを全てMP3にしMP3用のフォルダを作ってみんなブチこんでくれるコマンド。 アルバムのディレクトリの中で使おう。
for F in $(ls|sed "s/\ /@/g"); do ffmpeg -i "$(echo $F| sed "s/@/\ /g")" -vn -ac 2 -ar 44100 -ab 128k -acodec libmp3lame -f mp3 "$(echo $F|sed "s/@/\ /g"|sed "s/flac/mp3/g")" ; done; mkdir $(echo ${PWD##*/} | sed -e "s@\ @@g"); mv *.mp3 $(echo ${PWD##*/}|sed -e "s@\ @@g")/
lsが渡す文字の半角スペースをコマンドの分割文字として勘違いされないよう@に変えていて、変換時のファイル名指定で元に戻しているので、もしかしたら@がタイトルに入ってる楽曲があると死ぬかもしれない。

20.04.27 追記

全てのffmpegコマンドをバックグラウンドでさせたら爆速だった(なおコンピュータは一瞬で燃え上がる)ので、シェルスクリプトになっちゃうけどこっちのほうが便利になった。

ffmpegにただ&をつけても変換が始まらない……と思っていたら https://blog.prophet.jp/1232 が参考になった。メッチャありがとうございます……。


flacmp3(というコマンド名としてパス通したところに置いておく)
#!/bin/bash
musicdir="$HOME/0/Music"
if [ x$1 = "x" ];then
echo "Processing"
for F in $(ls|sed "s/\ /@/g"); do
ffmpeg -i "$(echo $F| sed "s/@/\ /g")" -vn -ac 2 -ar 44100 -ab 192k -acodec libmp3lame -f mp3 "$(echo $F|sed "s/@/\ /g"|sed "s/flac/mp3/g")" 1>>/tmp/flacmp3.log 2>&1 </dev/null &
done
wait
cat /tmp/flacmp3.log
rm /tmp/flacmp3.log
mkdir $musicdir/.mp3/$(echo ${PWD##*/} | sed -e "s@\ @@g")
mv *.mp3 $musicdir/.mp3/$(echo ${PWD##*/}|sed -e "s@\ @@g")/
echo "Done."
fi

最初のワンライナ版と違ってmusicdirに楽曲用フォルダを指定しておいて、その直下に.mp3というフォルダを作ってそこに入れてもらうようになった。

コマンドラインで flacmp3& と実行するとバックグラウンドプロセスのIDだけを残して黙々とやってくれる……はず。

0 件のコメント:

コメントを投稿