ディレクトリ内のwavファイルをffmpegでまとめてflacに変換

NASの容量を圧迫していたwavファイルが結構あったのでそいつらをまとめてflacに変換したいなぁと思ったので、ディレクトリ内のwavファイルをffmpegでまとめてflacに変換する方法のメモ。

ffmpegのオプションを変えればflac以外の形式にもできます。

コマンド

find . -type f -name "*.wav" -exec bash -c 'ffmpeg -i "$0"  -acodec flac -f flac -compression_level 12 "${0%.wav}".flac' {} ";"

コマンドの内容

ざっくりとコマンドの内容の解説です。

find

指定したディレクトリから条件に一致するファイルを列挙するコマンドです。

find . -type f -name "*.wav" -exec bash ... ";"

-type オプションで列挙対象をファイルだけに限定しています。 -name オプションで拡張子が .wav のファイルだけを列挙するようにしています。 -exec オプションで列挙したファイルに後続のコマンドを実行させるようにしています。今回の場合はbashを実行させています。 {} 部分はそれぞれ列挙されたファイルに置き換えられます。

bash

いわゆるshellの一種です。

拡張子を変更するときに変数展開の後方一致除去を使うために間にbashを噛ませて$0で引数を変数として使えるようにしています。

bash -c 'ffmpeg -i "$0"  -acodec flac -f flac -compression_level 12 "${0%.wav}".flac' 引数

-c オプションで実行するコマンドを指定しています。今回の場合はffmpegを実行するようにしています。 $0 で引数で与えられた値をそのまま展開します。""で括っているのは空白が入っていても問題ないようにするためです。 ${0%.wav} で引数で与えられた値の後方の.wavを除去したものを展開します。

ffmpeg

今回一番大事なファイルの変換コマンドです。

ffmpeg -i 入力ファイル  -acodec flac -f flac -compression_level 12 出力ファイル名

-i オプションで入力ファイルを指定しています。 -acodec オプションでオーディオコーデックをflacに指定しています。 -f オプションでファイルフォーマットをflacに指定しています。 -compression_level オプションでflacの圧縮レベルを指定しています。

これらを組み合わせて冒頭のコマンドになりました。

参考

https://askubuntu.com/questions/544651/how-to-specify-flac-compression-level-when-converting-with-avconv

https://qiita.com/t_nakayama0714/items/80b4c94de43643f4be51#parameterword-%E5%BE%8C%E6%96%B9%E4%B8%80%E8%87%B4%E9%99%A4%E5%8E%BB%E6%9C%80%E7%9F%AD%E4%B8%80%E8%87%B4