ffmpegにフレームをドロップしてメモリ使用量を減らすように指示しますか?


3

を使用して、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 XX最初-iの入力の前に追加を試して、入力の読み取り速度を制限することをお勧めします。
アナクスナマン

入力-rは、入力タイムスタンプを再生成することです。
ギャン

あなたは追加することにより、処理速度を遅くすることができます-vf realtimeし、それが違いを作るかどうかを確認
ギャン

@Mulvya:マンページは、処理をリアルタイムに遅くするという点で-vf realtime似て-reいます。処理は既にリアルタイム(約0.8倍)よりも低速で実行されているため、フレームがドロップされる原因を誤解していない限り、これが違いを生むとは思いませんか?
悪意のある

フレームがドロップされることはありません。アイデアは、エンコードの速度を落とすとメモリの使用がスムーズになるかどうかを確認することでした。
ギャン

回答:


3

これは、カメラからキャプチャしてFULL HDをストリーミングするときの環境の問題であり、ネットワークがボトルネックのffmpeg rtbufsizeをかなり速く塗りつぶし、ffmpegがフレームをドロップし始めるときに、これが問題であることを発見しました。これはあなたの問題の解決策のように聞こえます。

libavformatライブラリは、すべてのmuxerおよびdemuxersockで設定できるいくつかの汎用グローバルオプションを提供します。

rtbufsize整数(入力)

    リアルタイムフレームのバッファリングに使用される最大メモリを設定します。

出典:FFmpeg Formatsドキュメント

150 MBの制限付きバッファが必要だと仮定して、これを試してください:

ffmpeg -rtbufsize 150M -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

つまり、マシンが追いつくことができない間、着信データをRAMに充填し始め、それによりバッファがいっぱいになり、限界に達するとフレームを大幅にドロップし始めます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.