エンコーダーのチューニングに関する大まかなガイドは次のとおりです。
基本から始めましょう。オプションの短い集中砲火は、目的と期待を理解せずに、予想されるアウトプットを突然改善するという結論に飛び込むのは不利です。
1.エンコーダーのオプションを理解することから始めます。
NVENCベースのエンコーダーの場合、各エンコーダーが使用するオプションの学習から始めます(Linuxを使用しているため、ここに貼り付ける前にxclipを使用してコーデックオプションをクリップボードにコピーします)。
(a)。H.264エンコーダーの場合:
ffmpeg -hide_banner -h encoder=h264_nvenc | xclip -sel clip
出力:
Encoder h264_nvenc [NVIDIA NVENC H.264 encoder]:
General capabilities: delay
Threading capabilities: none
Supported pixel formats: yuv420p nv12 p010le yuv444p yuv444p16le bgr0 rgb0 cuda
h264_nvenc AVOptions:
-preset <int> E..V.... Set the encoding preset (from 0 to 11) (default medium)
default E..V....
slow E..V.... hq 2 passes
medium E..V.... hq 1 pass
fast E..V.... hp 1 pass
hp E..V....
hq E..V....
bd E..V....
ll E..V.... low latency
llhq E..V.... low latency hq
llhp E..V.... low latency hp
lossless E..V....
losslesshp E..V....
-profile <int> E..V.... Set the encoding profile (from 0 to 3) (default main)
baseline E..V....
main E..V....
high E..V....
high444p E..V....
-level <int> E..V.... Set the encoding level restriction (from 0 to 51) (default auto)
auto E..V....
1 E..V....
1.0 E..V....
1b E..V....
1.0b E..V....
1.1 E..V....
1.2 E..V....
1.3 E..V....
2 E..V....
2.0 E..V....
2.1 E..V....
2.2 E..V....
3 E..V....
3.0 E..V....
3.1 E..V....
3.2 E..V....
4 E..V....
4.0 E..V....
4.1 E..V....
4.2 E..V....
5 E..V....
5.0 E..V....
5.1 E..V....
-rc <int> E..V.... Override the preset rate-control (from -1 to INT_MAX) (default -1)
constqp E..V.... Constant QP mode
vbr E..V.... Variable bitrate mode
cbr E..V.... Constant bitrate mode
vbr_minqp E..V.... Variable bitrate mode with MinQP (deprecated)
ll_2pass_quality E..V.... Multi-pass optimized for image quality (deprecated)
ll_2pass_size E..V.... Multi-pass optimized for constant frame size (deprecated)
vbr_2pass E..V.... Multi-pass variable bitrate mode (deprecated)
cbr_ld_hq E..V.... Constant bitrate low delay high quality mode
cbr_hq E..V.... Constant bitrate high quality mode
vbr_hq E..V.... Variable bitrate high quality mode
-rc-lookahead <int> E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
-surfaces <int> E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
-cbr <boolean> E..V.... Use cbr encoding mode (default false)
-2pass <boolean> E..V.... Use 2pass encoding mode (default auto)
-gpu <int> E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
any E..V.... Pick the first device available
list E..V.... List the available devices
-delay <int> E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
-no-scenecut <boolean> E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
-forced-idr <boolean> E..V.... If forcing keyframes, force them as IDR frames. (default false)
-b_adapt <boolean> E..V.... When lookahead is enabled, set this to 0 to disable adaptive B-frame decision (default true)
-spatial-aq <boolean> E..V.... set to 1 to enable Spatial AQ (default false)
-temporal-aq <boolean> E..V.... set to 1 to enable Temporal AQ (default false)
-zerolatency <boolean> E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
-nonref_p <boolean> E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
-strict_gop <boolean> E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
-aq-strength <int> E..V.... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
-cq <float> E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
-aud <boolean> E..V.... Use access unit delimiters (default false)
-bluray-compat <boolean> E..V.... Bluray compatibility workarounds (default false)
-init_qpP <int> E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
-init_qpB <int> E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
-init_qpI <int> E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
-qp <int> E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
-weighted_pred <int> E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)
-coder <int> E..V.... Coder type (from -1 to 2) (default default)
default E..V....
auto E..V....
cabac E..V....
cavlc E..V....
ac E..V....
vlc E..V....
(b)。HEVC / H.265エンコーダーの場合:
ffmpeg -hide_banner -h encoder=hevc_nvenc | xclip -sel clip
出力:
Encoder hevc_nvenc [NVIDIA NVENC hevc encoder]:
General capabilities: delay
Threading capabilities: none
Supported pixel formats: yuv420p nv12 p010le yuv444p yuv444p16le bgr0 rgb0 cuda
hevc_nvenc AVOptions:
-preset <int> E..V.... Set the encoding preset (from 0 to 11) (default medium)
default E..V....
slow E..V.... hq 2 passes
medium E..V.... hq 1 pass
fast E..V.... hp 1 pass
hp E..V....
hq E..V....
bd E..V....
ll E..V.... low latency
llhq E..V.... low latency hq
llhp E..V.... low latency hp
lossless E..V.... lossless
losslesshp E..V.... lossless hp
-profile <int> E..V.... Set the encoding profile (from 0 to 4) (default main)
main E..V....
main10 E..V....
rext E..V....
-level <int> E..V.... Set the encoding level restriction (from 0 to 186) (default auto)
auto E..V....
1 E..V....
1.0 E..V....
2 E..V....
2.0 E..V....
2.1 E..V....
3 E..V....
3.0 E..V....
3.1 E..V....
4 E..V....
4.0 E..V....
4.1 E..V....
5 E..V....
5.0 E..V....
5.1 E..V....
5.2 E..V....
6 E..V....
6.0 E..V....
6.1 E..V....
6.2 E..V....
-tier <int> E..V.... Set the encoding tier (from 0 to 1) (default main)
main E..V....
high E..V....
-rc <int> E..V.... Override the preset rate-control (from -1 to INT_MAX) (default -1)
constqp E..V.... Constant QP mode
vbr E..V.... Variable bitrate mode
cbr E..V.... Constant bitrate mode
vbr_minqp E..V.... Variable bitrate mode with MinQP (deprecated)
ll_2pass_quality E..V.... Multi-pass optimized for image quality (deprecated)
ll_2pass_size E..V.... Multi-pass optimized for constant frame size (deprecated)
vbr_2pass E..V.... Multi-pass variable bitrate mode (deprecated)
cbr_ld_hq E..V.... Constant bitrate low delay high quality mode
cbr_hq E..V.... Constant bitrate high quality mode
vbr_hq E..V.... Variable bitrate high quality mode
-rc-lookahead <int> E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
-surfaces <int> E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
-cbr <boolean> E..V.... Use cbr encoding mode (default false)
-2pass <boolean> E..V.... Use 2pass encoding mode (default auto)
-gpu <int> E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
any E..V.... Pick the first device available
list E..V.... List the available devices
-delay <int> E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
-no-scenecut <boolean> E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
-forced-idr <boolean> E..V.... If forcing keyframes, force them as IDR frames. (default false)
-spatial_aq <boolean> E..V.... set to 1 to enable Spatial AQ (default false)
-temporal_aq <boolean> E..V.... set to 1 to enable Temporal AQ (default false)
-zerolatency <boolean> E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
-nonref_p <boolean> E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
-strict_gop <boolean> E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
-aq-strength <int> E..V.... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
-cq <float> E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
-aud <boolean> E..V.... Use access unit delimiters (default false)
-bluray-compat <boolean> E..V.... Bluray compatibility workarounds (default false)
-init_qpP <int> E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
-init_qpB <int> E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
-init_qpI <int> E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
-qp <int> E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
-weighted_pred <int> E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)
2.ハードウェアの制限を理解し、オプションを適用する前に、まず正しいデフォルトに固執します。
特にPascalでのHEVCエンコードの場合、NVENCで発生するハードウェアの制限については、この回答を参照してください。
FFmpegを備えた現在の世代のNVIDIAハードウェアで利用可能なハードウェアアクセラレーションインフラストラクチャについては、この回答を参照してください。
次に、その情報を使用して、次の手順に進みます。
3.構文は重要です。
FFmpegに引数を渡す順序は次のとおりです。
(a)。バイナリを呼び出します。
(b)。-loglevel
入力を宣言する前に、FFmpegに引数を渡します(直接渡すなど)。
(c)。などのハードウェアアクセラレーションによるデコードを使用している場合はcuvid
、ここで宣言し、必要な特定の引数を含めます。この時点で、デコーダーには予想される入力解像度、サポートされているコーデックなどの特定の制約があることを言及することが不可欠です。この段階ではエンコードが失敗し、回復できません。実際、MPV開発者はこれを繰り返し言及していますが、ミッションクリティカルなコンテンツ配信のためにハードウェアアクセラレーションによるデコードに依存しないでください。
(d)。入力を宣言します。ストリームの場合、URLを使用し、必要に応じて、必要に応じて追加のフラグ(バッファーサイズなど)を追加します。ローカルリソース(アクセス可能なファイルシステム上)の場合、絶対ファイルパスが必要です。
(e)。オプションで、フィルターを挿入します。これは、サイズ変更、ピクセル形式の会話、インターレース解除などの機能に必要です。ここで使用しているフィルターによっては、ハードウェアベースのデコーダー(セクション(c)で説明したように、フィルターが処理できない場合、エンコードは失敗します。
(f)。適切なビデオとオーディオエンコーダを呼び出し、それはビットレートに来るときなど、マッピング、ビットレート、エンコーダのプリセットとして、それらに必要な引数を渡し、自分の所望の値が経由して設定されていることを確認-b:v
、-maxrate:v
および-bufsize:v
オプション。これらを空白のままにしないでください。これは、これらの値が重要な理由の良い出発点です。いつものように、プリセットを指定することから始めます。下にスクロールして、この特定のエンコーダーによるプリセットのパフォーマンスへの影響に関する注意事項を確認してください。
(g)。FFmpegは出力ファイルの選択された拡張子に応じてファイルの必要な出力形式を推測できますが、必要に応じて追加のオプションを基になるマルチプレクサに渡すことができるように、出力形式を明示的に宣言することをお勧めします(-fオプションを使用) 、HLS、mpegts、DASHなどのストリーミング形式でよくあることです。
(h)。出力ファイルへの絶対パス。
上記の例では、次のように引用されています。
ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
-qmin 10 -qmax 52 "e:\output.mp4"
適切なビットレートを指定して(-b:v
、-maxrate:v
および-bufsize:v
設定を使用)、適応量子化エンコーディング技術(空間および時間AQメソッドがサポートされ、一度に1つしか使用できません)を有効にし、オプションで(および個別に)出力品質を上げることができます以下に示すように、重み付き予測を有効にする(Bフレームのサポートを無効にする)だけでなく、必要に応じて適切なダウンスケールとサイズ変更のためのオプションのフィルターも有効にします。以下の例は、mpeg2でエンコードされたmpegts入力を処理するスニペットを示しています。
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v mpeg2_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 \
-spatial_aq:v 1 -aq-strength:v 15 -coder:v cabac \
-f mp4 "e:\output.mp4"
警告:重み付き予測(-weighted_pred
)は、適応量子化と同時に有効にできないことに注意してください。そうしようとすると、エンコーダーの初期化に失敗します。
上記のスニペットは、入力ファイルがMPEG2ストリームであることを前提としています。そうでない場合は、分析後に正しいCUVIDデコーダーに切り替えます。
ffprobe -i e:\input.ts
H.264 / AVCの場合、以下に示すようにスニペットを変更します。
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 -spatial_aq:v 1 \
-aq-strength:v 15 -coder:v cabac \
-f mp4 "e:\output.mp4"
NVENCの適応量子化または重み付き予測オプションのいずれかを有効にすると、特に特定のデバイスドライバーの組み合わせで、安定性に問題が生じる可能性があることに気付きました。可能な場合-refs:v
は、AQと加重予測を切り替える代わりに、16 フレーム程度に設定された汎用オプションと組み合わせてBフレーム(3つ以下)を使用することを検討してください。
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 -refs:v 16 \
-bf:v 3 -coder:v cabac \
-f mp4 "e:\output.mp4"
チューリング、具体的に、あなたはまた、(トグルを参照して以下のように参照のためにBフレームを可能にするから利益を得ることができます-b_ref_mode:v middle)
。
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 -refs:v 16 \
-bf:v 3 -coder:v cabac -b_ref_mode:v middle \
-f mp4 "e:\output.mp4"
スレッド数に関する追加のメモ(-threads
オプションを介してffmpegに渡されます):
特定のしきい値を超えるエンコーダスレッドが増えると、レイテンシが増加し、エンコードメモリのフットプリントが大きくなります。エンコード遅延の増加により、固定ビットレートモードおよびVBV(ビデオバッファ検証)と呼ばれるほぼ一定のビットレートモードでスレッド数が増えると、品質の低下がより顕著になります。キーフレームには、低品質のキーフレームのパルスを避けるために、他のフレームタイプよりも多くのデータが必要です。
ゼロ遅延またはスライススレッドモードには遅延はありませんが、このオプションはサポートされているエンコーダーのマルチスレッド品質をさらに悪化させます。
そのため、認識されるエンコーダのスループットが長期的にもたらす利点を相殺するため、レイテンシが問題となるエンコードのスレッド数を制限するのが賢明です。
また、Windowsを使用しているため、\
上記のコマンドをテストするUnixボックスからこれを書いているので、上記のシェルエスケープを削除することもできます。
プリセットおよびインターレースエンコーディングの考慮事項によるパフォーマンスへの影響に関する注意事項:
高スループット、低レイテンシパフォーマンスを実現するには、いずれかllhp
またはllhq
プリセットを使用していることを確認してください。これは、さまざまなデバイスとの幅広い互換性が期待されるライブストリーミングなどのワークロードに最も役立ちます。したがって、Bフレームなどのパフォーマンスを損なう機能を完全に省略して、より高いビットレート間の適切なトレードオフを実現できます。使用とスループット。より高いプリセット(デフォルトなどmedium
)を使用すると、エンコーダのスループットが大幅に低下すると同時に、品質出力のリターンが急速に低下します。NetflixのVMAFの品質測定値llhp
とllhq
測定値 は実質的に無視できますが、前者によるエンコーダのパフォーマンスの向上(テストベッドで〜30%以上)は間違いなく十分です。
llhp
およびllhq
プリセット、および使用中の他のプリセットについては-rc:v
、エンコーダオプションで公開されている引数を渡すことで、組み込みのレート制御メソッドをオーバーライドすることもできます。たとえば、固定ビットレートエンコーディングでは、-rc:v cbr
(cbr_ld_hq
レート制御方式よりも大幅に高速で、スループットが20%増加します)を指定できます。選択したプリセットはスループットに最も大きな影響を与え、その後、必要に応じてオプションでオーバーライドできるプリセットオプション(使用中のレート制御方法など)が影響することに注意してください。
エンコードワークフローを検討し、必要に応じて調整します。マイレージは、ソースコンテンツ、使用中のフィルターチェーン、特定のpltform構成変数(GPUやドライバーバージョンなど)などに基づいて、明らかに異なります。
同じように、NVIDIAは、古いVolta NVENCエンコーダーを使用する1660Tiラインでも、Turingのインターレースエンコーディングをすべての層で明示的に無効にしていることに注意してください。インターレースエンコーディングのサポートが必要な場合は、代わりにPascalまたは古いSKUに切り替えてください。