ffmpegのnvencでCRFエンコーディングを使用するにはどうすればよいですか?



How Can I Use Crf Encoding With Nvenc Ffmpeg



解決:

CRFベースのエンコードの場合、以下のスニペットの次の引数をFFmpegに渡します。

-c:v h264_nvenc -rc:v vbr_hq -cq:v 19 -b:v 2500k -maxrate:v 5000k -profile:v high

もちろん、ターゲットビットレートと固定を調整する必要がありますcq値。 19は、視覚的に0と同じでありながら、ファイルサイズとの適切な圧縮トレードオフを維持するため、推奨される設定です。 CRFの機能の詳細については、この記事を参照してください。



注意してください-cqスケールは対数です。つまり、0は本質的に無損失であり、51は絶対的に最悪です。

Bフレームなどのオプションを追加することで品質をさらに向上させることができます(これを最大3つに制限します。これには、H.264メインプロファイル以上が必要です。ベースラインプロファイルはBフレームをサポートしていません。これを行うには、合格します。-bf {uint}をビデオエンコーダに送信します。-bf:v 4の場合、エンコーダーは4つのBフレームを使用します。



ここで重要な部分は-cq:v19および-rc:v vbr_hq引数。これにより、事前設定された可変ビットレートと最大許容ビットレートの両方でエンコーダーを調整できます(-b:vおよび-maxrate:v)19のCRF値を順守している間。

そして今、NVENCについての小さなメモ、そして高品質のエンコードのためにそれを調整します:

NVENCは、他のハードウェアベースのエンコーダと同様に、いくつかの制限があり、特にHEVCの場合、既知の制限は次のとおりです。



  1. Pascalについて:

    HEVCエンコードの場合、次の制限が適用されます。

    • 32を超えるCTUサイズはサポートされていません。
    • HEVCのBフレームもサポートされていません。
    • NVENCエンコーダーでサポートされているテクスチャ形式は、エンコーダーが使用できる色空間を制限します。現在、4:2:0(8ビット)と4:4:4(10ビット)をサポートしています。 4:2:210ビットなどの無関係な形式はサポートされていません。これは、そのようなカラースペースが必要な一部のワークフローに影響します。
    • 先読み制御も32フレームに制限されています。詳細については、この社説をご覧ください。

Turingには、HeVCのBフレームのサポートと、参照としてBフレームを使用する機能が追加され、Pascalで利用できるすべての拡張機能があります。この機能の例については、この回答を参照してください。

  1. また、Maxwell Gen 2(GM200xシリーズGPU)の場合:

    HEVCエンコーディングには次の機能がありません。

    • サンプルのアダプティブオフセット(SAO)ループフィルター機能。
    • 適応量子化
    • 先読みレート制御。

ここでのマクスウェルへの影響は、ビットレートが制限されたHEVCを使用したモーションの多いシーンでは、先読み機能と適応サンプルオフセット(SAO)ループフィルタリング機能が欠落しているため、アーティファクト(ブロック性)が発生する可能性があることです。 Pascalはこの機能をいくらか改善しましたが、ビデオエンコーダーが構築されたSDKのバージョンによっては、すべての機能が利用できるとは限りません。

たとえば、PascalでのH.264エンコードの加重予測モードには、NVENC SDK 8.0x以降が必要であり、このエンコードモードではBフレームのサポートも無効になります。同様に、Nvidia Performance Primitives(NPP)で実行されるハードウェアベースのスケーラーとNVENCの組み合わせにより、特にアップスケールされたコンテンツで、アーティファクトのスケーリングを犠牲にして、ビデオスケーリングアプリケーションのパフォーマンスが向上する可能性があります。 NPPのスケーリング機能がGPU上のCUDAコアから実行されるため、同じことがビデオエンコードパイプラインにも影響します。そのため、追加の負荷によってもたらされるパフォーマンスへの影響をケースバイケースで分析して、パフォーマンス品質を判断する必要があります。トレードオフは許容されます。

これを覚えておいてください:ハードウェアベースのエンコーダーは、同等のソフトウェアベースの実装よりもカスタマイズが常にいくらか少なくなるため、マイレージと許容可能な出力品質は常に異なります。

そしてあなたの参照のために:

FFmpegを使用すると、次の方法でいつでもエンコーダーの設定を参照してカスタマイズできます。

ffmpeg-hエンコーダー{エンコーダー名}

したがって、NVENCベースのエンコーダーの場合、次のコマンドを実行できます。

ffmpeg-hエンコーダー= hevc_nvencffmpeg-hエンコーダー= h264_nvenc

次のコマンドを実行すると、すべてのNVENCベースのエンコーダーとNPPベースのスケーラー(そのように構築されている場合)も表示されます。

エンコーダーデコーダーフィルターのiの場合;エコー$ iを実行します:; ffmpeg -hide_banner- $ {i} | egrep -i'npp | cuvid | nvenc | cuda '完了

テストベッドでの出力例:

エンコーダー:V ..... h264_nvenc NVIDIA NVENC H.264エンコーダー(codec h264)V ..... nvenc NVIDIA NVENC H.264エンコーダー(codec h264)V ..... nvenc_h264 NVIDIA NVENC H.264エンコーダー( codec h264)V ..... nvenc_hevc NVIDIA NVENC hevcエンコーダー(codec hevc)V ..... hevc_nvenc NVIDIA NVENC hevcエンコーダー(codec hevc)デコーダー:V ..... h263_cuvid Nvidia CUVID H263デコーダー(codec h263) V ..... h264_cuvid Nvidia CUVID H264デコーダー(codec h264)V ..... hevc_cuvid Nvidia CUVID HEVCデコーダー(codec hevc)V ..... mjpeg_cuvid Nvidia CUVID MJPEGデコーダー(codec mjpeg)V ... .. .mpeg1_cuvid Nvidia CUVID MPEG1VIDEOデコーダー(codec mpeg1video)V ..... mpeg2_cuvid Nvidia CUVID MPEG2VIDEOデコーダー(codec mpeg2video)V ..... mpeg4_cuvid Nvidia CUVID MPEG4デコーダー(codec mpeg4)V ..... vc1_cuvid Nvidデコーダー(codec vc1)V ..... vp8_cuvid Nvidia CUVID VP8デコーダー(codec vp8)V ..... vp9_cuvid Nvidia CUVID VP9デコーダー(codec vp9)フィルター:... hwupload_cuda V-> VシステムメモリフレームをアップロードCUDAデバイスに。 ... scale_npp V-> V NVIDIA PerformancePrimitivesのビデオスケーリングとフォーマット変換 

にとって-libx264からのcrfの置き換えは-cqまたは-h264_nvencからのqp:

-crf定品質モードの品質を選択します

-cq VBRレート制御の一定品質モードの目標品質レベル(0〜51、0は自動を意味します)を設定します

-qp一定の量子化パラメータレート制御方法(-1から51まで)(デフォルトは-1)

最速のハードウェアアクセラレーションエンコード方式:

ffmpeg -hwaccel cuvid -c:v h264_cuvid -resize 640x480 -i input.mp4 -c:v h264_nvenc -cq 21 -c:a copy output.mp4

-入力の解像度のサイズを変更します(ハードウェア)。 ffmpegをコンパイルする必要はありません--enable-libnpp forscale_nppフィルター。

詳細情報:

ffmpeg-hエンコーダー= h264_nvenc

ffmpeg -h denoder = h264_cuvid 

私は解決策を見つけたと信じています:

ffmpeg -hwaccel auto -i in.mp4 -c:v h264_nvenc -preset llhq -rc constqp -qp 21 -c:a copy out.mp4

h264_nvencが使用しているようです-代わりにqp-crf。このオプションは、-rcはに設定されますconstqp。