web-dev-qa-db-ja.com

ffmpeg -threads設定を変更する方法

tubeサイトで作業しています。 linuxmp4に変換する専用サーバーでffmpegを使用してビデオを実行しています。

サーバーの仕様:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Stepping:              3
CPU MHz:               3491.749
BogoMIPS:              6983.49
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7

テスト中の問題は、一度に4〜5回しか実行しない場合でも、サーバーの負荷が平均で約36に急上昇することです。これは1人のユーザーです。それが開くとき、私は多くの人々がすぐにアップロードすることを想像します。

ffmpegは、変換ごとに利用可能なすべてのリソースを使用しようとするようです。

変更できる-threads設定があると聞きましたが、見つかりません。 8 CPUサーバーがあります。これは変換にのみ使用されるため、最適な設定は2から4の間になると聞きました。テストできます。

しかし、どうすればこの設定を変更できますか?私がオンラインで見るものはすべて、この設定について説明していますが、変更する手順については説明していません。

15
Jacob

必要なオプションフラグは、実際には-threadsそして次のように使用します(1つのスレッドのみ):

ffmpeg -i somefile.wmv -c:a libfdk_aac -c:v libx264  -threads 1 transcoded.mp4

ただし、再スケーリング、フィルターの適用、最終的なフレーム品質/フレームレートなど、サーバーの負荷と運用時間を増加させるかなりの微妙な点があります-いくつかのVMアーキテクチャという事実は言うまでもありません実際にすべてを2回読み書きします(ネイティブに1回、仮想に1回!!!)

スピードを上げるためのヒントをいくつか紹介します。

  1. キューを使用して、一度に1つのアイテムのみがトランスコードされるようにする
  2. ユーザーに小さなファイルをリクエストする
  3. 次のようにして、マシンの全馬力を使用します。
    • rAMディスクからの読み取りと書き込み
    • トランスコーディングタスクをベアメタルに切り替える
    • 使用する -threads 0

何をするにしても、時間がかかるだけなので、トランスコーディングプロセスについてユーザーに通知してください。 (I.J.T.T.)

[LordNeckbeardのコメントを反映するように編集されたコマンド]

17
denjello

これは少し古いかもしれませんが、Dockerのようなコンテナーにとっては完璧なタスクのように思えます。

  • Ffmpegをfull horsepowerで実行します(denjelloがそれを呼び出したため)
  • しかし、それをドッカー内で実行させます

これで、ffmpegコマンドラインオプションを使用しなくても、単一のffmpegインスタンスが消費するリソースの量を制限できます。 CPUだけでなく、メモリとIOも含まれます。

さらに:バックグラウンドで実行される可能性のあるさまざまなタスクがあり、それらにかかる時間を気にせず、高速で実行する必要があるタスクがあるため、さまざまなタスクに重みを付けることができます。

https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources を参照してください

Githubにはあらかじめ定義されたffmpegイメージがあります: https://github.com/jrottenberg/ffmpeg

docker run jrottenberg/ffmpeg \
        -i http://url/to/media.mp4 \
        -stats \
        $ffmpeg_options  - > out.mp4

オーバーヘッドが原因で単一の変換の実行速度が遅くなる可能性がありますが、複数のインスタンスを同時に実行する場合、これは大きなメリットになる可能性があります。これは、各タスクが基盤となるOSから分離されているため、セキュリティの向上は言うまでもなく、非常によく拡張されます。

3