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


22

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

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

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


あなたは変更することができますslowfast、あなたの最初のコマンドで。CRFはに実装されていませんnvenc
ギャン

NVENCの目標は、リアルタイムビデオエンコーディング(ビデオコールなど)を許可することです。品質は下位の考慮事項です。
CL。

回答:


23

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:v 19-rc:v vbr_hq引数です。これにより、CRF値19を遵守しながら、プリセットの可変ビットレートと最大許容ビットレート(-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フレームに制限されています。詳細については、この社説をご覧ください。

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

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

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

ここでのマックスウェルの影響は、ビットレートが制限されたHEVCを使用した動きの激しいシーンでは、先読み機能が欠落し、SAO(Adaptive Sample Offset)ループフィルタリング機能によりアーティファクト(ブロック)が発生する可能性があることです。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

1
素晴らしい答えです!nvencのffmpeg wikiは少し時代遅れであり、すべての情報が欠けています...数分あれば、そこに知識を提供できれば素晴らしいと思います:trac.ffmpeg.org/wiki/HWAccelIntro
slhck

1
答えてくれてありがとう:) ffmpeg wikiこのようなより多くの答えが必要
hongducwb

フィードバックをお寄せいただきありがとうございます。これをFFmpeg wikiに追加することを検討します。
林正浩

出力カラーファイルは暗いように見えますが、1つの引数で入力ファイルと同じ色を制御できることを覚えています
-hongducwb

2
vbr_minqp廃止されたようです。にはCRFモードがないため、この回答は誤解される可能性があることに同意しますh264_nvenc
slhck

4

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

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


1
いいえ、-qpすべてとは異なり-crfます。h264_nvencさんは-qp同等ですlibx264 s 'は-qp
ニャー

@Meowそれは私にとっては十分に近いですが、違いがあることを知ってうれしいです。将来これを見るかもしれない人のために、このページはCRFとQPの違いを説明しています
Alexander01998

3

-crflibx264から交換することも-cqまたは-qph264_nvencから:

-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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.