質問: ライブ配信動画の加工を実現するためにffmpegを利用することを検討してます。 rtmp の入力を最大2つ想定しています。課題はソースが1つの場合でも出力動画をエンコードさせたいのです。出力動画は720x540を想定しており、左右に360x540の画像を配置する仕様です。 入力はスマートフォンからのアップストリームを想定してます。1つの入力が入ったらエンコードを開始し、2つ目がが入ったらOverlayを上書きすることを想定してます。 ソースの入力が1つでもエンコードする方法があれば教えてください。 cam1 rtmp [on---------------offxxxxxxxxon-------------off] cam2 rtmp [offxxxxxxxxon---------------offxxxxxon--------] このような動作を期待しております。ffmpegはcam2のソースが入ってくるまでエンコードを開始しません。期待値はcam2はnullsrcで表示されることです。 質問をまとめると ・ffmpegを使ってOverlay処理したい ・ソースは最大2つだが1つの場合もある ・ソースが2つ揃わないと出力が始まらないので、ソースが1つ入った時点でEncodeを開始したい ・ソースが1つの際は片方はnullsrcを期待する ``` $ ffmpeg -i rtmp://localhost/live/1 \ -i rtmp://localhost/live/2 \ -filter_complex "nullsrc=size=720x540[base];[0:v] scale= 360x540 [v1];[1:v] scale=360x540 [v2]; \ [base][v1] overlay=0:0[tmp1]; [tmp1][v2] overlay= 360:0" \ -preset fast -c:v libx264 -c:a aac -strict -2 -f flv rtmp://local host/live/livestream ``` 解決方法をご存知でしたらご教授いただけますでしょうか。
回答: rtmpソースを試せてないのですが、 offになっているときはnullsrcとして飛ばして、onになったときに上書きで同じ出力先にすると 先に出力した方がエラーになって切り替わるのでうまくいくかもしれません。 あとoverlayで2つ並べるよりもhstackで並べる方が処理が速いです。(ライブ配信だと差があるかはわかりません) 場合によってはsetptsでリセット(setpts=PTS-STARTPTS)が必要かもしれません。 ``` $ ffmpeg -f lavfi -i nullsrc=size=360x540 -preset fast -c:v libx264 -c:a aac -strict -2 \ -f flv rtmp://local host/live2/livestream $ ffmpeg -i rtmp://localhost/live/1 \ -i rtmp://localhost/live/2 \ -filter_complex [0:v][1:v]hstack,scale=720:540 -preset fast -c:v libx264 -c:a aac -strict -2 -f flv rtmp://local host/live/livestream ``` OBSでもいいのならVLCビデオソースで左右に並べる方法もあります。