開発者でも何でもない素人によるサイト

ffmpegで音声ファイルを一括変換するシェルスクリプト

  • このエントリーをはてなブックマークに追加

今回は貯まっている音楽ファイルを、ffmpegとシェルスクリプトで好みの形式に一括変換します。

特にATRACを一括変換することにしました。

今日この日まで、昔作成したATRACファイルをめんどくさがってそのまま使ってきましたが、消え行きそうな規格なので今後のサポートに不安があります。

変換先の形式は音質がこれ以上劣化しないようにflacにしましたが、AACとかでも良かったかもしれません。

なお、作業環境はUbuntu Desktop 16.04 (amd64)です。

ブログタイトルに「Raspberry Pi」という言葉が入っていますが、今回はRaspberry Piで作業していないので、以下の作業がラズパイ上で動作する保証は一切ありません。(出来たところで、ラズパイの処理能力的に無理がありそうです)

ffmpegのインストール

Ubuntu 16.04はリリースが比較的最近でパッケージも新しそうなので、手軽にパッケージインストールします。

sudo apt install ffmpeg

シェルスクリプト作成

音楽を保管しているフォルダからATRAC(.oma)のファイルを探して、flacに一括変換するスクリプトを作成しました。

本当はこんな作業いろんな人がやってるだろうし、公開されているスクリプトをコピペしたかったのですが、ドンピシャのやつを見つけられず、また最近シェルスクリプトを書く練習もしているので、スキルアップもかねてググりながらなんとか作成しました。

findコマンドと組み合わせたことで、いちいちディレクトリを移動して、forループを使う必要がなく、ディレクトリをまたがった膨大な量のファイルを変換する場合に便利です。

しかし、ffmpegが使い慣れないのでとても苦労しました…

正直晒すレベルじゃないかもしれないですが、自分のようにスキルレベルがない初心者の方になればなによりです。

うまく動作せずに、いろいろ悩んでいたところ、ファイルやディレクトリ名のスペースのせいで正しく動作していないことがわかったので、以下のスクリプトでは自動で半角スペースは「_」(アンダーバー)で置換されます。

また、コメントしてある通り、拡張子とコーデックを指定すれば、他のコーデックでも利用可能かと思います(ATRAC→flacとwav→flacは動作確認済み)。

注:改めてaacとかで指定しようとしたのですが上手くいかないので、wav→flacか、atrac→flacで使って下さい。

シェルスクリプトに作り慣れてないので、書き方が冗長なところや、正しくないところがあると思います。適宜修正してください。

#!/bin/bash
# 指定したディレクトリ内の音声ファイルを一括変換
# 

# 検索開始ディレクトリを指定
# このディレクトリ以下から、指定した拡張子のファイルを検索して変換する
dirpath='/media/sda1'

# 変換元ファイルの「拡張子」と、変換後ファイルの「拡張子」を指定
# 「.」(ドット)は含まない。 
originextension=wav
outputextension=flac

# 変換のコーデックを指定
outputcodec=flac

# ディレクトリ名の空白を「_」で置換
find "$dirpath" -name "* *" | rename 's/ /_/g'

# findで指定拡張子のファイルを探して、変換指定
for oldfulname in $(find "$dirpath" -name "*.$originextension" -print);
do
# 元ファイルの拡張子をカット
        name=`echo $oldfulname | cut -d'.' -f1`;

# 変換実行、ビットレート等変える場合、以下を編集する
        ffmpeg -n -i "$oldfulname" -acodec ${outputcodec} "${name}.${outextension}";
done

注:エラーが出る場合、ファイル名かディレクトリ名のスペースで引っ掛かってると思うので、数回繰り返し実行するといいかと思います。

ちなみに、これだと元ファイルが残ります。

似たようなスクリプトで一括消去もできるので、以下のスクリプトを作成し実行します。

実行前に、上のスクリプトで変換ができているか、しっかり確認しましょう。

#!/bin/bash

# 不要なファイルを探して消す

# 指定するディレクトリ以下のファイルを、findの条件に従って消す。
# 今回は拡張子が「.oma」のファイルを一括削除
dirpath="/path/dir"

for rmname in $(find "$dirpath" -name "*.oma" -print);
do
        rm ${rmname};
done

これで、/path/dir以下にある、拡張子omaのファイルがすべて消えました。