web-dev-qa-db-ja.com

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

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のどのパラメーターを使用する必要がありますか?

13
Andrei Botalov

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

こちらもご覧ください

17
llogan

より少ないリソースを使用する方法で同じ結果を達成する異なる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です。整数が大きいほど、優先順位はlowerですはニュートラルは0です。指定したコマンドを使用して8に設定すると、CPUはプロセスの時間を短縮し、「電力」が少なくなるように見えます。もちろん、この数値が高すぎるか低すぎる場合は、変更できます。
  • GUIメソッド:これは、正確な数の制御が少なくなり、プロセスの開始後すぐに有効にならないため、推奨されません。ただし、よりわかりやすいです。 ffmpegが実行されている状態で、システムモニターを開きます。 ffmpegという名前のプロセスまでスクロールし、左クリックして選択し、右クリックして、優先度を「低」または「非常に低」に設定します。

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

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

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

4
Richard

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

0
劉大為