これは私の現在のビデオのサイズを変更するための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を使用する必要がありますか?
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の場合、既知の制限があります。
パスカルについて:
HEVCエンコードの場合、以下の制限が適用されます。
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
私は解決策を見つけたと思います:
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
に設定されている場合にのみ機能します。
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