フィルタのfifoと、マルチプレクサのfifoの使い方。fifoは複数のストリームの同時出力で処理速度の差が出る、例えばネットワーク障害や書き込み速度の差が付くときなどにつける。複数出力ではなく1出力で再接続するような使い方でも使える。フィルタのfifoにはオプション設定はない。

fifo, afifoフィルタが2024年2月8日以降のffmpeg 7.0から廃止になった。

利用例:
ffmpeg で複数出力
1つの出力内容を複数に振り分ける tee

基本コマンド

テストソースでエラーが出たときに再接続する例。
ffmpeg -f lavfi -re -i testsrc -c:v libx264 -map 0:v -flags +global_header -f fifo -fifo_format flv -max_recovery_attempts 20 -recovery_wait_time 5 -attempt_recovery 1 -recover_any_error 1 rtmp://example.com/livekey

avformat/fifo: avoid repeated scaling of timestamps on failure and re… · FFmpeg/FFmpeg@d9f07a5
Reconnect RTMP stream after disconnect and continue from specific position : ffmpeg

フィルタのfifoの例。最初は普通再生で次に逆再生をつなげる。試すなら動画時間の短いファイルを使う。
ffmpeg -i input -filter_complex "[0:v]reverse,fifo[r];[0:a]areverse,afifo[ar];[0:v][0:a][r][ar]concat=n=2:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" output

映像と音声を逆再生にエンコードする

tee内にfifoを使うのは主にネットワーク越しとローカルに保存するときに、ネットワークの調子がよくなくてローカル保存も一緒に止まらないように異なる処理を行うのに使う。ファイルから配信するときは-reをつけて、デバイスから配信するときは-reをつけない。
ffmpeg -re -i input -c:v libx264 -c:a aac -ar 44100 -ab 128k -map 0:v -map 0:a -f tee "[use_fifo=1:f=fifo:fifo_format=flv:drop_pkts_on_overflow=1:attempt_recovery=1:recovery_wait_time=1]rtmp://example.com:1935/publicorigin/key|out.flv"

ラズパイゼロのffmpegで録画しつつSRTで送信しリトライも行う
FFMPEG: How to stream to multiple outputs with the same encoding independently – Stack Overflow

trimフィルタで途中から読み込むときなどにも使う。
trim=10:18,setpts=PTS-STARTPTS+7/TB,fifo

video – FFmpeg – Trim and overlay – Freeze on frame – Super User

テスト放送用サンプルコマンド。udpストリームをffplayで開くと配信画面との遅延を見比べることができる。
ffmpeg -f lavfi -re -i testsrc2=s=1280x720:r=30 -f lavfi -re -i sine=440:0:44100 -c:v libx264 -c:a aac -ar 44100 -ab 128k -map 0:v -map 1:a -f tee "[use_fifo=1:f=fifo:fifo_format=flv:drop_pkts_on_overflow=1:attempt_recovery=1:recovery_wait_time=1]rtmp://example.com:1935/publicorigin/key|out.flv|[f=mpegts]udp://localhost:8080"
ffplay -i udp://localhost:8080

低遅延で再生する。
ffplay -hide_banner -analyzeduration 1 -probesize 32 -fflags +nobuffer -i udp://localhost:8080

Lowest possible latency over UDP? : ffmpeg

-max_delay 0 -max_probe_packets 1 -analyzeduration 0 -flags +low_delay -fflags +nobufferをそれぞれ入力オプションで使って挙動に変化がないか確認してみる。音声があるときは-audio_buffer_size 4も試す。
ffplay -hide_banner -max_delay 0 -max_probe_packets 1 -analyzeduration 0 -flags +low_delay -fflags +nobuffer -audio_buffer_size 4 -i udp://localhost:8080

Remove delay on ffplay for capture device : ffmpeg

rtmp入力で再接続の-listen 1を使う。先に受信側を実行しておく。
ffmpeg -listen 1 -timeout 10000 -f flv -i rtmp://127.0.0.1:5000/mystream/test -c:v libx264 test.mp4
ffmpeg -re -f lavfi -i testsrc2=duration=60 -c:v libx264 -f flv rtmp://127.0.0.1:5000/mystream/test

video – FFMPEG rtmp “connecting” instead of “listening” – Super User

公式ドキュメント:
FFmpeg Formats Documentation : fifo
FFmpeg Filters Documentation : fifo, afifo

オプション

  • -fifo_format[string]
    フォーマットの指定。拡張子のない出力先ならつける。つけなければ出力内容から自動判断される
  • -queue_size[int]
    キューのパケットサイズの指定
    既定値:60
    範囲:1 から INT_MAX まで
  • -format_opts[string]
    コンテナフォーマットのオプション指定。key=value形式で指定する。複数つなげるには:をつける
  • -drop_pkts_on_overflow[boolean]
    キューが満杯になったらドロップさせるかどうかの指定。ライブ配信などでキューが満杯になったときにドロップさせて遅延が発生するのを回避する
    既定値:0
  • -restart_with_keyframe[boolean]
    キューからあふれたときや失敗したときから再開した後にキーフレームが来るのを待つかどうかの指定
    既定値:0
  • -attempt_recovery[boolean]
    出力に失敗したときに再開を試すかどうかの指定。これは特にネットワーク越しの出力でエラーが返ったときに便利
    既定値:0
  • -max_recovery_attempts[int]
    再開を試す回数。0は無制限
    既定値:0
    範囲:0 から INT_MAX まで
  • -recovery_wait_time[duration]
    何秒間隔で再開を試すかの指定
    既定値:5
  • -recovery_wait_streamtime[boolean]
    配信時間を元に再開を試すかどうかの指定。0 ならば-recovery_wait_timeで指定したとおりの間隔で試す。1 ならば配信している動画の時間を元に再開を試し、ドロップしたときには再開時間の間隔が狭くなる
    既定値:0
  • -recover_any_error[boolean]
    エラーに関係なく再開を試す。ただし 0 のときは-attempt_recovery 1を指定していても永久的に出るエラーには再開を試さない
    既定値:0

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)