私は、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のパラメータを変更することがいくつか見つかりましたが、プリセットスロー
がすでに最高品質のアプローチであるはずですよね?
エンコーダのチューニングの目安はこちらです。 目的も期待値もわからないまま、いきなりオプションの乱発で期待値が上がるという結論に達するのは不利なので、基本的なところから説明します。 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.ハードウェアの制限を理解し、オプションを適用する前に、まず正常なデフォルトに固執する:。
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).出力ファイルへの絶対パス。
上記の例では、次のように引用されます。
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の適応量子化または重み付き予測オプションのいずれかを有効にすると、特に特定のデバイスドライバの組み合わせで、安定性に問題が生じる可能性があることに気づきました。可能であれば、AQと重み付け予測を切り替える代わりに、Bフレーム(3つ以下)と一般的なオプションである -refs:v
を16またはそのあたりに設定したものを組み合わせて使用することを検討してみてください。
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"
特に Turing では、以下のように 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 (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に切り替えてください。
Libvorbis for audioは遅いようです。ac3は15%以上のスピードアップが期待できます。
それは、あなたのビデオドライバがおかしいか、ffmpegの古いコピーを使っているということです。 q 私はあなたのクリップを持っていませんが、私のPVRからSD tsファイルを取得し、あなたの設定を使用しました。
GTX750 (non TI) (安い方)で700fps (Yoursの設定)でした。
925fps (あなたの設定とac3オーディオ)
もうひとつ、私がお勧めできるのは
qmaxを23程度に変更してください。