web-dev-qa-db-ja.com

ffmpegのnvencでCRFエンコーディングを使用する方法

これは私の現在のビデオのサイズを変更するための2GBから300MBまでのコマンドです(1080p)が、時間がかかります。

mkdir newfiles  
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v  libx264 -preset slow -crf 21 -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"  
pause

NVIDIA GTX1070でnvencを試しました。

mkdir newfiles  
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v h264_nvenc -preset slow -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"  
pause

出力サイズは常に元のサイズの3倍または5倍です - nvencは-crfを使用しません。

では、nfmcをffmpegと組み合わせて使用​​して、ビデオを高品質で小さいサイズに変換/サイズ変更するにはどうすればよいですか。エンコードにGPUを使用する必要がありますか?

14
hongducwb

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

-c:v h264_nvenc -preset llhq -rc:v vbr_minqp -qmin:v 19 -qmax:v 21 -b:v 2500k -maxrate:v 5000k -profile:v high

もちろん、目標のビットレートと目標の最小値と最大値の-qp値を調整する必要があります。 19は、視覚的に0と同じであるとして推奨される設定ですが、ファイルサイズとの良好な圧縮のトレードオフを維持します。 21は、所与のビットレート範囲内でこれを超えないようにエンコーダを制約するピーク値である。

-qpスケールは対数であることに注意してください。つまり、0は本質的にロスレスで、51が絶対的な最悪値になります。

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

ここで重要な部分は-preset-rc:v vbr_minqp引数です。これにより、プリセット変数bitrateと最大許容bitrateの両方でエンコーダを調整することができます。 (-b:v-maxrate:v

そして今、NVENCについて、そして高品質のエンコードのためにそれを調整することについてのちょっとしたメモ:

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

  1. パスカルについて:

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

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

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

ここでのマックスウェルに対する影響は、制約されたビットレートの下でのHEVCを伴う動きの多いシーンが、ルックアヘッド機能および適応サンプルオフセット(SAO)ループフィルタリング機能がないためにアーチファクト(ブロックノイズ)を被る可能性があることである。 Pascalはこの機能を多少改善していますが、ビデオエンコーダのビルドに使用されたSDKのバージョンによっては、すべての機能が利用できるわけではありません。

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

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

そしてご参考までに:

FFmpegでは、カスタマイズのためにいつでもエンコーダの設定を参照できます。

ffmpeg -h encoder {encoder-name}

したがって、NVENCベースのエンコーダの場合は、次のように実行できます。

ffmpeg -h encoder=hevc_nvenc

ffmpeg -h encoder=h264_nvenc

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

for i in encoders decoders filters; do
    echo $i:; ffmpeg -hide_banner -${i} | egrep -i "npp|cuvid|nvenc|cuda"
done

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

encoders:
 V..... h264_nvenc           NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc                NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc_h264           NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc_hevc           NVIDIA NVENC hevc encoder (codec hevc)
 V..... hevc_nvenc           NVIDIA NVENC hevc encoder (codec hevc)
decoders:
 V..... h263_cuvid           Nvidia CUVID H263 decoder (codec h263)
 V..... h264_cuvid           Nvidia CUVID H264 decoder (codec h264)
 V..... hevc_cuvid           Nvidia CUVID HEVC decoder (codec hevc)
 V..... mjpeg_cuvid          Nvidia CUVID MJPEG decoder (codec mjpeg)
 V..... mpeg1_cuvid          Nvidia CUVID MPEG1VIDEO decoder (codec mpeg1video)
 V..... mpeg2_cuvid          Nvidia CUVID MPEG2VIDEO decoder (codec mpeg2video)
 V..... mpeg4_cuvid          Nvidia CUVID MPEG4 decoder (codec mpeg4)
 V..... vc1_cuvid            Nvidia CUVID VC1 decoder (codec vc1)
 V..... vp8_cuvid            Nvidia CUVID VP8 decoder (codec vp8)
 V..... vp9_cuvid            Nvidia CUVID VP9 decoder (codec vp9)
filters:
 ... hwupload_cuda     V->V       Upload a system memory frame to a CUDA device.
 ... scale_npp         V->V       NVIDIA Performance Primitives video scaling and format conversion
19
林正浩

私は解決策を見つけたと思います:

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を使用しているようです。このオプションは-rcconstqpに設定されている場合にのみ機能します。

4
Alexander01998

Libx264からの-crfの置き換えは、h264_nvencからの-cqまたは-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

入力時の-resize解決(ハードウェア)。 ffmpegを--enable-libnppフィルタ用のscale_nppでコンパイルする必要はありません。

詳細については:

ffmpeg -h encoder=h264_nvenc

ffmpeg -h denoder=h264_cuvid
3
abc