ffmpegで音のノーマライズを行う方法
今回は、ffmpegのノーマライズについてです。
ノーマライズとは、音量が大きすぎたり小さすぎたりするものを統一する処理のことです。
使用例として、複数の音楽を連続で聞いていても、曲ごとに音量変更が必要ないといった感じで使用します。
ffmpegを使用したノーマライズの方法は複数ありますが、それらを比べる記事が無かったので比べてみました。
それではいってみましょう。
■□■□■
ffmpegを使用したノーマライズの方法は、調べた限り以下の2つがあります。
①-filter:a loudnorm
②-af dynaudnorm
それぞれ説明します。
①-filter:a loudnorm
この方法は、以下のコマンドで使用できます。
ffmpeg -i 入力ファイル -filter:a loudnorm 出力ファイル
具体的には、音量が低すぎたり高すぎたりするファイルを変換する際、最初の方の音としばらくした後の音の音量の差が大きく、音楽を聞いている際に違和感が生じます。
これを回避する方法として、音楽の音量を分析して、それから変換するという方法が取られますが、ffmegの場合、単純な一行のコマンドでそれを実行するのは難しいため、2度変換処理を挟む必要があります。
スクリプトを組めばこの2度の変換もできるため、スクリプトを組みなれている方はそれが最適解かと思います。
②-af dynaudnorm
この方法は、以下のコマンドで使用できます。
ffmpeg -i 入力ファイル -af dynaudnorm 出力ファイル
やっていることとしては、最大音量を元に、全体の音量を調整しているようです。
この方法の欠点は、最大音量を元にしているため、ノーマライズしたとしても音量差が出てしまうという点です。
ただ、全体の音量を変換しているため、難しいことをせずにそれなりのノーマライズを行いたいというだけであれば、こちらのほうが違和感が少なく音を聞けるかと思います。
また、この方法のバグ?か分からないのですが、動画をノーマライズしようとすると、最初の一秒間の音が無音になってしまいました。この現象の回避方法として、動画と音を別に変換し、後からくっつけるという方法を取ることで、発生しなくなりました。
ffmpeg -i 入力動画ファイル -af dynaudnorm 出力音声ファイル
ffmpeg -i 出力動画ファイル -i 出力音声ファイル -c:v copy -c:a copy 出力ファイル
一行目で無音の動画変換を行い、二行目で動画なしの音声の変換を行い、三行目でそれをくっつけています。音声ファイルの場合は特に問題なく変換できていたため、こんな方法でも大丈夫なようです。ただ面倒ですけどね。
■□■□■
というわけで、ffmegのノーマライズの方法を紹介しました。
現状私は-af dynaudnormを使用していますが、スクリプトが組める方は-filter:a loudnormを使用したほうが良さそうです。私は簡単なスクリプトしか組めないので断念しました笑
また公式ではないですが、ffmeg-normalizeというツールも有志の方が開発してくれているようなので、興味がある方は調べてみてください。
以上!