【ffmpeg】-f tee でマルチ配信の可能性について

追記 2017年1月28日
片方の配信が止まっても、もう片方が中断しないように onfail=ignore を追加した


調べてみたところ、Drop(処理落ち) が多発したため実用には向かなかった。

まずは普通にニコ生と twitchに多重配信してみたが、音声は出るものの映像が全く映らなかった。

ffmpeg -rtbufsize 50MB -f dshow -i video="SCFH DSF":audio="virtual-audio-capturer" -pix_fmt yuv420p -vcodec libx264 -acodec libmp3lame -f tee -map 0:0 -map 0:1 -movflags +faststart -flags +global_header "[f=flv:onfail=ignore]rtmp://ニコ生|[f=flv:onfail=ignore]rtmp://twitch"

公式文章を見ると global_header を明示的に指定しろって書いてあるので指定すると映像が映った。しかし rtbufsize を大きくしても Drop が多発して配信が途切れる結果となった。うまい配信方法があったら教えて下さい。

FFmpeg documentation : : tee
Creating multiple outputs - Tee psuedo-muxer – FFmpeg
EncodingForStreamingSites – FFmpeg

ffmpeg -rtbufsize 50MB -f dshow -i video="SCFH DSF":audio="virtual-audio-capturer" -pix_fmt yuv420p -vcodec libx264 -acodec libmp3lame -flags +global_header -f tee -map 0:0 -map 0:1 "[f=flv:onfail=ignore]rtmp://ニコ生|[f=flv:onfail=ignore]rtmp://twitch"

その後改めて同じコマンドを試すとうまくいくようになっている。また出力数は2以上指定できるので2サイト同時配信しながらファイルを保存することもできる。普通に配布している ffmpeg を使うと Past duration too large が大量に表示されることがあるので、-vsync passthrough -frame_drop_threshold 4 を追加する。そのほかの注意点として map を必ず指定する。

input.flv からニコ生と twitch に配信し output.flv で保存する例
ffmpeg -re -i input.flv -vsync passthrough -frame_drop_threshold 4 -map 0:0 -map 0:1 -c copy -f tee -movflags +faststart -flags +global_header "[f=flv:onfail=ignore]rtmp://ニコ生|[f=flv:onfail=ignore]rtmp://twitch|E:\output.flv"

入力ファイルが flv 以外の場合でエラーが出て配信できない場合はあらかじめ動画ファイルを flv 形式に変換しておく。
ffmpeg -i input -c copy output.flv

さらにプレビュー用として UDP 出力もできる。
ffmpeg -re -i input.flv -vsync passthrough -frame_drop_threshold 4 -map 0:0 -map 0:1 -c copy -f tee -movflags +faststart -flags +global_header "[f=flv:onfail=ignore]rtmp://ニコ生|[f=flv:onfail=ignore]rtmp://twitch|[f=mpegts]udp://localhost:8080|E:\output.flv"

動画に音声が2つある場合には出力で振り分けることができる。入力が mp4 なら出力も mp4 にできる。
ffmpeg -re -i input.mp4 -vsync passthrough -frame_drop_threshold 4 -movflags +faststart -flags +global_header -map 0:v -map 0:a -c copy -f tee "[select=\'v,a:0\':f=mp4:onfail=ignore]1.mp4|[select=\'v,a:1\':f=mp4:onfail=ignore]2.mp4"

パイプして複数のサイトに配信する従来の方法は Windows の ffmpeg で生放送する方法 : 複数サイト同時配信 を参照。
関連記事

コメント

非公開コメント

プロフィール

ロベルト

お問い合わせはこちらまで
robelt2525[at]gmail.com

中の人 @nico_lab

広告リンク
Amazon
楽天市場

ブログ更新用 @blo_nico_lab

詳しいプロフィールはこちら

当ブログは、Amazonアソシエイトに参加しています。