amix使って音声マージしたらなんか音小さいんだけど。。
はい。やらかしました。ffmpegを使う機会があり、音周りロジックの修正をしたのですが、なんかもともとあったやつより音小さくなってました。。
自戒の意を込めて記事として残します。
やりたかったこと
複数の音声素材をfilter_complex
でいじり、最終的にマージして1つのファイルにしたかった。
どうやったか
ffmpeg -i a.mp3 -i b.mp3 -i c.mp3 \
-filter_complex " \
[0:a]~~[0a] \
[1:a]~~[1a] \
[2:a]~~[2a] \
[0a][1a][2a]amix=inputs=3[a] \
" -map "[a]" output.mp3
これで一応音声はマージできていたのですが、なんか音が小さい。
既存のロジックはamerge使っていました。それと比べると音量が半分くらいになってる。
原因
調べた限りだと、amixはinputsの数に応じて音量を1/n
しているようだった。
ただこれリファレンスに乗ってたわけじゃないから確たる証拠が無い。
対応
対応方法は自分の中で2つあった
1.amergeを使う
採用したのはこっちの案。
もともとamergeを使ってたのだから戻せばよいのだ。
しかし、今回の改修の影響でinputされる音声ファイルの量が増えたため、既存ロジックのままだとinput channel多すぎエラーが出る。
Input channel layout '40 channels (FL+FR+FC+LFE+BL+BR+FLC+FRC+BC+SL+SR+TC+TFL+TFC+TFR+TBL+TBC+TBR+DL+DR+WL+WR+SDL+SDR+LFE2)' is not supported
その辺を考慮しながら修正してこんな感じにした。
ffmpeg -i a.mp3 -i b.mp3 -i c.mp3 \
-filter_complex " \
[0:a]~~,channelsplit=channel_layout=stereo[0al][0ar]\
[1:a]~~,channelsplit=channel_layout=stereo[1al][1ar]\
[2:a]~~,channelsplit=channel_layout=stereo[2al][2ar]\
[0al][1al][2al][0ar][1ar][2ar]amerge=inputs=6,pan=stereo|FL=c0+c1+c2|FR=c3+c4+c5[a] \
" -map "[a]" output.mp3
# FL=c0+c1+c2 の = を < にすると自動でノーマライズしてくれる
2.amix時にvolumeを上げる
volumeが1/nされるなら打ち消すためにn倍volumeを増加させればよい。
ffmpeg -i a.mp3 -i b.mp3 -i c.mp3 \
-filter_complex " \
[0:a]~~[0a] \
[1:a]~~[1a] \
[2:a]~~[2a] \
[0a][1a][2a]amix=inputs=3,volume=3[a] \
" -map "[a]" output.mp3
感想
定量化できないものをテストするのってかなり難しい。
と思ってたらffmpegで音の波形を出力するコマンドがあるらしい。
https://nico-lab.net/create_samples_waves_image_with_ffmpeg/
これ使って波長一致ロジックとか組めばテストの信用性が上がると思う。