ffmpegで複数の音声をamergeしようとした際エラーが出た
ffmpeg -y -i a.mp3 -i b.mp3 -i c.mp3 -i d.mp3 -i e.mp3
-filter_complex "[0:a]aloop=loop=-1:size=2e+09,atrim=start=0.0:end=15.0,volume=volume=enable='between(t,0,15.0)':volume=1.0:eval=frame,afade=t=out:st=14.0:d=1.0[0a];
[1:a]aloop=loop=0:size=2e+09,atrim=start=0.0:end=15.0,volume=volume=enable='between(t,0,15.0)':volume=1.0:eval=frame[1a];
[2:a]aloop=loop=0:size=2e+09,atrim=start=0.0:end=15.0,volume=volume=enable='between(t,0,15.0)':volume=1.0:eval=frame[2a];
[3:a]aloop=loop=0:size=2e+09,atrim=start=0.0:end=15.0,volume=volume=enable='between(t,0,15.0)':volume=1.0:eval=frame[3a];
[4:a]aloop=loop=0:size=2e+09,atrim=start=0.0:end=15.0,volume=volume=enable='between(t,0,15.0)':volume=1.0:eval=frame[4a];
[0a][1a][2a][3a][4a][5a][6a]amerge=inputs=7[OUTPUT_AUDIO]" -map "[OUTPUT_AUDIO]" -b:a 128k -acodec libmp3lame -f mp3 output.mp3
というコマンドを打ったら、エラーが出た。
Input channel layout '10 channels (FL+FR+FC+LFE+BL+BR+FLC+FRC+BC+SL)' is not supported
amergeする時のストリームのチャネルが多すぎるということだったので、channelsplit=channel_layout
オプションを各ストリームにつけてみた。
ffmpeg -y -i a.mp3 -i b.mp3 -i c.mp3 -i d.mp3 -i e.mp3
-filter_complex "[0:a]aloop=loop=-1:size=2e+09,atrim=start=0.0:end=15.0,volume=volume=enable='between(t,0,15.0)':volume=1.0:eval=frame,afade=t=out:st=14.0:d=1.0,channelsplit=channel_layout=stereo[0a];
[1:a]aloop=loop=0:size=2e+09,atrim=start=0.0:end=15.0,volume=volume=enable='between(t,0,15.0)':volume=1.0:eval=frame,channelsplit=channel_layout=stereo[1a];
[2:a]aloop=loop=0:size=2e+09,atrim=start=0.0:end=15.0,volume=volume=enable='between(t,0,15.0)':volume=1.0:eval=frame,channelsplit=channel_layout=stereo[2a];
[3:a]aloop=loop=0:size=2e+09,atrim=start=0.0:end=15.0,volume=volume=enable='between(t,0,15.0)':volume=1.0:eval=frame,channelsplit=channel_layout=stereo[3a];
[4:a]aloop=loop=0:size=2e+09,atrim=start=0.0:end=15.0,volume=volume=enable='between(t,0,15.0)':volume=1.0:eval=frame,channelsplit=channel_layout=stereo[4a];
[0a][1a][2a][3a][4a]amerge=inputs=7[OUTPUT_AUDIO]" -map "[OUTPUT_AUDIO]" -b:a 128k -acodec libmp3lame -f mp3 output.mp3
そしたら今度はInvalid audio stream. Exactly one MP3 audio stream is required.
と出た。
ここで2時間ぐらい悩んだのだが、原因はシンプルだった。
channelsplit=channel_layout=stereo[0a];
ステレオを指定した場合、出力されるチャネルは2つなのだが、ここでは1つしか設定していない。
これが原因だった。
修正後、amergeする前に各チャネルをamixするなどの処理を追加し、
ffmpeg -y -i a.mp3 -i b.mp3 -i c.mp3 -i d.mp3 -i e.mp3
-filter_complex "[0:a]aloop=loop=-1:size=2e+09,atrim=start=0.0:end=15.0,volume=volume=enable='between(t,0,15.0)':volume=1.0:eval=frame,afade=t=out:st=14.0:d=1.0,channelsplit=channel_layout=stereo[0al][0ar];
[1:a]aloop=loop=0:size=2e+09,atrim=start=0.0:end=15.0,volume=volume=enable='between(t,0,15.0)':volume=1.0:eval=frame,channelsplit=channel_layout=stereo[1al][1ar];
[2:a]aloop=loop=0:size=2e+09,atrim=start=0.0:end=15.0,volume=volume=enable='between(t,0,15.0)':volume=1.0:eval=frame,channelsplit=channel_layout=stereo[2al][2ar];
[3:a]aloop=loop=0:size=2e+09,atrim=start=0.0:end=15.0,volume=volume=enable='between(t,0,15.0)':volume=1.0:eval=frame,channelsplit=channel_layout=stereo[3al][3ar];
[4:a]aloop=loop=0:size=2e+09,atrim=start=0.0:end=15.0,volume=volume=enable='between(t,0,15.0)':volume=1.0:eval=frame,channelsplit=channel_layout=stereo[4al][4ar];
[0al][1al][2al][3al][4al]amix=inputs=5[LEFT_OUTPUT];
[0ar][1ar][2ar][3ar][4ar]amix=inputs=5[RIGHT_OUTPUT];
[LEFT_OUTPUT][RIGHT_OUTPUT]amerge=inputs=7[OUTPUT_AUDIO]" -map "[OUTPUT_AUDIO]" -b:a 128k -acodec libmp3lame -f mp3 output.mp3
これでやっとうまくいった。。
ちゃんとリファレンス読まないとだめすな。