を使用して、MJPEGからMPEG2にセキュリティカメラのリアルタイム映像をトランスコードしていffmpeg
ます。
残念ながら、トランスコーディングを実行するマシンは実際には対応できません(100%のCPU使用率)が、それでも「十分」であり、時々フレームがドロップされることはありません。しかし、何らかの理由ffmpeg
でフレームがドロップされないため、プロセスが着信フレームに遅れてメモリ使用量が増加し続け、マシンがメモリ不足になり、ビデオがひどく破損し始めます。
ffmpeg
フレームをより積極的にドロップするように指示する方法はありますか?メモリ使用量が1.9GBに達すると問題が発生するため、メモリが1.5GBを超えるとmonit
プロセスを再起動しようとしましたが、10分ごとに再起動され、各トランスコードされたファイルの推奨15分長が壊れます。
これは私が使用しているコマンドです:
ffmpeg -overrun_nonfatal 1 -y -i udp://1.2.3.4
-c mpeg2video -b:v 2M -vf transpose=2
-preset ultrafast -an -r 30
out.mkv
マンページには、-r
オプションをフレームをドロップする出力オプションとして使用できると書かれていますが、私はこれを行っていますが、入力ストリームに追いつくためにフレームをドロップするのではなく、出力フレームレート(ここでは30fps)に一致するようにフレームをドロップするだけです。
この-vsync
オプションは、バッファリングを最小化するのではなく、フレームレートを一致させようとして、同様のことを行うようにも見えます。
-frame_drop_threshold
より有望に見えますが、これは、リアルタイムエンコーディングに追いつくのではなく、タイムスタンプに追いつくためにフレームをドロップすることについてのようです。
私が使用できる他のオプションはありffmpeg
ますか?これはリアルタイム/ストリーミング/低遅延オプションにあると思いますが、何も見つからないようです!
-r
は、入力タイムスタンプを再生成することです。
-vf realtime
し、それが違いを作るかどうかを確認
-vf realtime
似て-re
います。処理は既にリアルタイム(約0.8倍)よりも低速で実行されているため、フレームがドロップされる原因を誤解していない限り、これが違いを生むとは思いませんか?
-r XX
最初-i
の入力の前に追加を試して、入力の読み取り速度を制限することをお勧めします。