FFMpegとNVENCの最適な設定方法
私は、GPU (NVENC) のサポートで FFMPEG を使って、衛星放送受信機 (SD, mpeg2 .TS-Files) からのファイルを h264 .mp4 ファイルに変換しているところです。
以下は、私が使用しているラインです。
ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
-qmin 10 -qmax 52 "e:\output.mp4"
しかし、期待したほどの品質ではありません。そして、私のシステムのフルパワーは使われていない。
GPU使用率11%、CPU使用率30%のみ。
質問です。私のGeforce GTX 1080の計算能力をより多く使い、ファイルサイズを同じにして品質を向上させるためにできるいくつかの改良はありますか?
林正浩]3のパラメータを変更することがいくつか見つかりましたが、プリセットスロー
がすでに最高品質のアプローチであるはずですよね?
24
3
エンコーダのチューニングの目安はこちらです。 目的も期待値もわからないまま、いきなりオプションの乱発で期待値が上がるという結論に達するのは不利なので、基本的なところから説明します。 1.エンコーダのオプションを理解することから始めましょう。 NVENCベースのエンコーダの場合、各エンコーダのオプションを知ることから始めます(私はLinuxを使っているので、ここに貼り付ける前に、xclipを使ってコーデックオプションをクリップボードにコピーしていることに注意してください)。 (a).H.264エンコーダの場合。
出力:
(b).HEVC/H.265エンコーダの場合。
出力:
2.ハードウェアの制限を理解し、オプションを適用する前に、まず正常なデフォルトに固執する:。 NVENC、特にPascalでのHEVCエンコードで遭遇するハードウェアの制限については、この回答を参照してください。 FFmpegで現世代のNVIDIAハードウェアに利用可能なハードウェアアクセラレーションインフラについては、この回答を参照してください。 そして、その情報をもとに、次のステップに進みます。 3.構文が重要です:。 以下は、FFmpegに引数を渡す順番です。 (a).バイナリを呼び出す。 (b).FFmpegに引数を渡す場合(例えば、
-logvel
を直接渡すなど)、inputを宣言する前に行います。 (c).もし、cuvid
のようなハードウェアアクセラレーションデコーディングを使用している場合は、ここで宣言し、それが必要とする特定の引数を含めます。この時点で、デコーダには期待される入力解像度やサポートされるコーデックなどの特定の制約があることを述べておく必要があります。この段階で失敗するとエンコードに失敗し、回復できないので、実運用ではハードウェアアクセラレータの必要性を判断し検証することが推奨されます。実際、MPV devs have mentioned this repeatedly, don't rely on hardware-accelerated decoding for mission-critical content delivery.とあります。 (d).入力を宣言する。ストリームの場合、URLを使用し、必要であれば(バッファサイズなどの)追加フラグを先頭に付けます。ローカルリソース(アクセス可能なファイルシステム上)には、絶対ファイルパスが必要です。 (e).オプションで、フィルタを挿入する。これは、リサイズ、ピクセルフォーマット会話、デインターレースなどの関数に必要である。ここで使用するフィルタによっては、(c)項で説明したハードウェアベースのデコーダが、フィルタが処理できなければエンコードに失敗するような制約をもたらすことに注意されたい。 (f).適切なビデオおよびオーディオエンコーダを呼び出し、マッピング、ビットレート、エンコーダプリセットなど、必要な引数を渡します。ビットレートに関しては、-b:v
,-maxrate:v
,-bufsize:v
オプションで希望の値が設定されていることを確認します。これらを空白にしないでください。なぜこれらの値が重要なのかについては、こちらが良い出発点です。いつものように、プリセットを指定することから始めてください。下までスクロールして、この特定のエンコーダでのプリセットのパフォーマンスへの影響に関するメモをご覧ください。 (g).FFmpeg は、出力ファイルの選択された拡張子によって、必要な出力フォーマットを推測することができますが、HLS、mpegts、DASH などのストリーミングフォーマットの場合によくあるように、必要に応じて追加のオプションを基にした muxer に渡せるように、出力フォーマットを明示的に (-f オプションで) 宣言することが推奨されています。 (h).出力ファイルへの絶対パス。 上記の例では、次のように引用されます。適切なビットレート(
-b:v
,-maxrate:v
,-bufsize:v
の設定により)、適応量子化エンコーディング技術(空間および時間のAQメソッドをサポートし、一度に1つだけ使用可能)、オプション(別途)で以下に示す重み付き予測(Bフレームサポートを無効にします)、さらに必要であれば適切なダウンスケールおよびリサイズ用のオプションフィルターを有効にして出力品質を上げることが可能です。以下の例では、mpeg2 でエンコードされた mpegts 入力を処理するスニペットを示しています。警告: 重み付け予測 (
-weighted_pred
) は適応量子化と同時に有効にすることができないことに注意してください。これを実行しようとすると、エンコーダの初期化に失敗します。 上記のスニペットは、入力ファイルが MPEG2 ストリームであることを想定しています。そうでない場合は、解析後に正しいCUVIDデコーダーに切り替えてください。その'H.264/AVCの場合、以下のようにスニペットを修正します。
NVENCの適応量子化または重み付き予測オプションのいずれかを有効にすると、特に特定のデバイスドライバの組み合わせで、安定性に問題が生じる可能性があることに気づきました。可能であれば、AQと重み付け予測を切り替える代わりに、Bフレーム(3つ以下)と一般的なオプションである
-refs:v
を16またはそのあたりに設定したものを組み合わせて使用することを検討してみてください。特に Turing では、以下のように B フレームを参照用に有効にすることも有効です(トグル
-b_ref_mode:v middle)
を参照)。スレッド数についての補足説明 (
-threads
オプションで ffmpeg に渡されます):。 ある閾値を超えたエンコーダースレッドが増えると、レイテンシーが増加し、エンコーディングメモリのフットプリントが大きくなります。一定のビットレートモードや、VBV (video buffer verifier) と呼ばれるほぼ一定のビットレートモードでは、エンコードの遅延が増えるため、スレッド数が多いほど品質の劣化が顕著になります。キーフレームは、品質の悪いキーフレームのパルスを避けるために、他のフレームタイプよりも多くのデータを必要とします。 ゼロディレイモードやスライススレッドモードは遅延がありませんが、このオプションはサポートされているエンコーダでマルチスレッドの品質を大幅に悪化させます。 したがって、レイテンシーが重要なエンコードでは、スレッド数を制限するのが賢明です。 そして、あなたはWindowsを使用しているので、上記のコマンドをテストしているUnixボックスからこれを書いているので、上記のシェルエスケープ `を削除したいかもしれません。 **プリセットとインターレースエンコーディングの考慮によるパフォーマンスへの影響についてのメモ:**。 高スループット、低レイテンシーパフォーマンスのために、
llhpまたは
llhqプリセットを使用していることを確認してください。これは、ライブストリーミングのような、より多くのデバイスとの互換性が期待される作業負荷に最も有効で、そのため、Bフレームのようなパフォーマンスを低下させる機能は、使用中の高いビットレートとスループットの間の良いトレードオフで完全に省略することが可能です。より高いプリセット(デフォルトの
mediumなど)は、[品質の収穫が急速に減少する][6] 出力と同時に、エンコーダのスループットが大幅に低下します。NetflixのVMAF][7]で測定した
llhpと
llhqの品質の差はほとんどありませんが、前者によるエンコーダーの性能向上(私のテストベッドでは〜30%以上)は確実に評価できるものです。 llhp
とllhq
プリセット、およびその他のプリセットでは、エンコーダのオプションで公開されている-rc:v
引数を渡すことによって、内蔵のレートコントロールメソッドをオーバーライドすることもできます。例えば、一定のビットレートのエンコーディングでは、-rc:v cbr
を指定することができます (これはcbr_ld_hq
のレートコントロール方法よりもかなり高速で、スループットがさらに ~20% アップします)。選択したプリセットがスループットに最も影響を与える**ことに注意してください。次にプリセットのオプション(使用中のレートコントロール方法など)が続きますが、必要に応じて上書きすることができます。 エンコーディングワークフローを考慮し、必要に応じて調整してください。ソースコンテンツ、使用中のフィルターチェーン、特定のpltform設定変数(GPUやドライバーのバージョンなど)などにより、間違いなく異なります。 同じ意味で、NVIDIA は、古い Volta NVENC エンコーダを使用する 1660Ti ラインでも、すべての層で Turing のインターレースエンコーディングを明示的に無効にしている ことに留意してください。インターレース・エンコーディングのサポートが必要な場合は、代わりにPascalまたは古いSKUに切り替えてください。nvencのデフォルトはVBRで、それはいいのですが、どんなに調整しても、どんな解像度のファイルを与えても常に平均2Mのビットレートを与えたがるという事実を補うことはできません。これはエンコーダーの欠陥のように思えます。他のあらゆる点では予測通りのパフォーマンスを発揮するのに、720pのファイルには(例えば)
-b:v 4M
、1080pには-b:v 8M
が必要なのです。必要であれば、それらを少し下げることもできるでしょう。Libvorbis for audioは遅いようです。ac3は15%以上のスピードアップが期待できます。
それは、あなたのビデオドライバがおかしいか、ffmpegの古いコピーを使っているということです。 q 私はあなたのクリップを持っていませんが、私のPVRからSD tsファイルを取得し、あなたの設定を使用しました。
GTX750 (non TI) (安い方)で700fps (Yoursの設定)でした。
925fps (あなたの設定とac3オーディオ)
もうひとつ、私がお勧めできるのは
qmaxを23程度に変更してください。