2秒ぐらいのループ推奨音楽をffmpegとffplayでループ再生をシェルでする

むかし、DTMサークルの立ち上げに関わったことがあり、2-3秒ぐらいのループ推奨のwavサンプルを貰った。

これを、作業するときに聴きたいと思ったのだが、再生ソフトで1曲ループさせると、2-3秒の音楽の終了とともにブチっと毎回途切れてしまう。 Spoitfyのプレイヤーだとこれがないのだが、わざわざ再生ソフトで再生するのも面倒だったので、ffmpegとffplayでやろうと思った。

まず、最初にフォルダ内のの'.wav'拡張子の音楽を探し、そのファイル名をパイプラインで送る

find . -type f -name '*.wav' | 

これだと、2-3秒で次の音楽へ移行してしまうので、ループ処理をする。

xargs -I% ffmpeg -t 3600 -stream_loop -1 -i % -f wav %.output.wav

そのまま保存しても良いのだが、1時間のループ処理をすると、元は複数ファイル合わせて100MBぐらいだったのが、50GBに化けてしまった。

そこで、パイプライン処理をして、エンコードしたループ音源をそのまま再生するようにする

ffmpeg -t 3600 -stream_loop -1 -i % -f wav - | ffplay -i -

という事で、完成

find . -type f -name '*.wav' | xargs -I% ffmpeg -t 3600 -stream_loop -1 -i % -f wav - | ffplay -autoexit -i -

音声をステレオにしたり、ffprobe等で確認したオーディオコーデックを指定する

find . -type f -name '*.wav' | xargs -I% ffmpeg -t 3600 -stream_loop -1 -i % -ac 2 -acodec pcm_s16le -f wav - | ffplay -autoexit -i -

ついでに、再生順序をランダムにする。

find . -type f -name '*.wav' | shuf | xargs -I% ffmpeg -t 3600 -stream_loop -1 -i % -ac 2 -acodec pcm_s16le -f wav - | ffplay -autoexit -i -

これで作業効率アップ間違いなし