ビデオを録画するときにffmpegによってCPU /メモリの使用量を最小限に抑える方法


13

Xvfbディスプレイからビデオ画面をキャプチャするためにFFmpegを使用しています。

現在、私はそれを呼び出します:

ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov

約5つのXvfbセッションからビデオを録画するため、CPU使用率が非常に高く、そのために遅延があります。また、メモリ使用量は、ffmpegプロセスごとに約300 MBです。

ビデオ画面キャプチャを作成するときにコンピューターリソースの使用量(特にCPUとメモリ)を最小限に抑えるために、ffmpegのどのパラメーターを使用する必要がありますか?

回答:


17

1.最初にロスレスRGB出力を作成します

ffmpeg -y -framerate 25 -video_size 1280x1024 -f x11grab -i :0.0 -c:v libx264rgb \
-crf 0 -preset ultrafast temp.mp4
  • 入力はRGBなので、エンコーダーlibx264rgbを使用すると、プレーンなlibx264を使用した場合に発生する可能性のある低速なRGBからYUVへの変換を回避できます。

  • これは、最速のx264エンコードプリセットである超高速を使用します。

  • -crf 0が使用されるため、出力はロスレスになります。

2.次に、再エンコードします

最初のコマンドの出力は膨大で、ほとんどのダムプレーヤーはRGB H.264を処理できないため、再エンコードできます。

ffmpeg -i temp.mp4 -c:v libx264 -crf 23 -preset medium -vf format=yuv420p out.mp4
  • この-crf値を試して、出力品質を制御できます。主観的に妥当な範囲は18〜28で、18は視覚的に無損失またはほぼ損失なしです。デフォルトは23です。

  • あなたがのために忍耐を持っている最も遅いプリセットを使用しますultrafastsuperfastveryfastfasterfastmediumslowslowerveryslow。デフォルトはmediumです。

  • -vf format=yuv420pQuickTimeやWindows Media Playerなどのダムプレーヤーで出力が機能するように追加しました。YouTubeにアップロードする場合、またはVLC、mpv、MPlayer、またはその他のFFmpegベースのプレーヤーでのみ再生する場合は、これを省略できます。

こちらもご覧ください


それは任意の数とすることができるので、私は(それはXvfbのだ)デフォルト以外のディスプレイからビデオをキャプチャ
アンドレイBotalov

@AndreyBotalovロスレス方式を試しましたか?それはあなたにとってより良いパフォーマンスでしたか?
llogan

1
現在ffmpeg-preset superfastパラメーターを使用して呼び出しています(試していません-crf)。このような場合、必要なリソースは少なくなり、十分なサイズのビデオが生成されます。
アンドレイボタロフ

@AndreyBotalov -crf 23は、値を宣言しない場合にデフォルトで使用されますが、とにかくsuperfast十分であれば、問題が解決する可能性があります。
llogan

1
h264_nvenc(nvidia)またはh264_qsv(modern intel cpu)を介してハードウェアエンコーディングを試すこともできます。これにより、エンコードの負荷がCPUから専用のh264ハードウェアに移行します。
ケン

4

より少ないリソースを使用する方法で同じ結果を達成する異なるffmpegオプションの使用に集中することをお勧めします。ただし、ffmpegで特定のことを本当に行う必要があり、使用するリソースが多すぎる場合は、使用するリソースを減らす方法があります。

ffmpegのCPUプロセスの優先度を下げることができます。

  • 端末方式:niceコマンドを使用して、プロセスの優先順位を変更します:nice -n 8 ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov。Linuxでは、優先順位番号(niceコマンド形式はnice -n <priority> <command>)の範囲は-20〜20です。整数が大きいほど、優先順位は低くなります。ニュートラルは0です。指定したコマンドを使用して8に設定すると、CPUはプロセスの時間を短縮し、「電力」が少なくなるように見えます。もちろん、この数値が大きすぎるか2つ低い場合は、変更できます。
  • GUIによる方法:これは、正確な数の制御が少なくなり、プロセスの開始後すぐに有効にならないため、推奨されません。ただし、よりわかりやすいです。でffmpeg実行し、システムモニタを開きます。という名前のプロセスまでスクロールしffmpeg、左クリックして選択し、右クリックして、優先度を「低」または「非常に低」に設定します。

メモリ使用量についても心配している場合は、プロセスに大量のメモリのみを使用して実行するように指示することはできないことを理解してください。カーネルは、プロセスのメモリ割り当てを自動的に制御します。timeoutスクリプトを使用してプロセスをケージする方法があり、プロセスと子プロセスがメモリを大量に使用すると(ユーザーが設定した制限)、安全に終了し、通知が表示されます。ただし、プロセスに(カーネルなどによって)大量のメモリが割り当てられているだけで、プロセスが保持できないメモリを要求すると、クラッシュします。

知っておくと便利なこと:

Cgroupの知識を使用すると、プロセスのスワップ性を制御するなど、多くの楽しいことができます。


2
ffmpegを優先度の低いキューに正しく配置することを理解していると、望ましくない遅延のあるビデオが生成されます。
アンドレイボタロフ

1
うーん...オンラインでそれを言っているものは何もありません...それを示す情報源はありますか?(そうでない場合、それはバグであるべきです)。
リチャード

2
私が正しく理解している場合、優先順位が低いということは、ffmpegのプロセッサー時間が現在よりも短くなることを意味します。私はそれreprioritizationが助けにはなりませんだと思うので、しかし、プロセッサがほぼ100%にロードされている
アンドレイBotalov

1
これは、プロセスのCPU使用率を制限するように設計されているため、CPUが100%で実行されている場合、処理がより簡単になります。
リチャード

4
優先順位をどのように変更しても、それが悪化するだけなので、これを-1にしました。優先度を低く設定すると、ffmpegのCPU時間が低下し、フレームのドロップが多くなります。または、優先度を上げると、システム上の他のプロセスがさらに遅くなります。両方の結果は望ましくありません。
gertvdijk

0

-re(入力)ネイティブフレームレートで入力を読み取ります。主にグラブデバイスまたはライブ入力ストリーム(ファイルからの読み取り時など)をシミュレートするために使用されます。実際のグラブデバイスまたはライブ入力ストリーム(パケット損失の原因となる可能性がある)で使用しないでください。デフォルトでは、ffmpegは可能な限り高速に入力を読み取ろうとします。このオプションは、入力の読み取りを入力のネイティブフレームレートまで遅くします。リアルタイム出力(ライブストリーミングなど)に便利です。


x11grabなどの「実際のグラブデバイスでは使用しないでください」。
-llogan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.