フィルタの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