2020年7月28日火曜日

GPUエンコードを試す(AMD)

H.266/VVCが先日発表されました。H265の半分のサイズに圧縮できるとか。

それは置いといて、

これまで動画のエンコードには、CPUを使ったlibx264 libx265を使っていました。
GPUエンコード(hevc_amfとかhevc_nvenc)を使うとさらにエンコード速度が速くなることは分かっていたのですが、デフォルト設定ではCPUエンコードに比べて画質が悪かったり、どのパラメータを弄れば調整できるのか不明だったため、GPUエンコードは諦めていました。
が、先日から弄っていたらなんとなくCPUエンコードと同等の品質、圧縮率を達成できましたので、メモを残しておきます。


ffmpeg -i input.mp4 -c:v hevc_amf -quality quality -qmin 2 -qmax 30 -b:v 400k -g 600 output.mp4

オプションについて

AMDのGPUを使った場合のオプションです。NVIDIAの場合は違うかもしれません。

-c:v hevc_amf

AMDのGPUを使ってH265エンコードをする場合はこのように指定します。
H264の場合は -c:v h264_amf
NVIDIAのGPUを使う場合h264_nvencまたはhevc_nvenc

-quality quality

speed, balance, qualityの3段階で品質優先か速度優先かを指定

-qmin 2 -qmax 30

品質の指定。小さいほうが品質が高くなり、大きくすると圧縮率が高くなります。試行錯誤の結果、qmax 30以上にするとブロックノイズが目立ってきました

-b:v 400k

平均ビットレートの指定らしいですが、基本的に言うことをきいてくれません。qmaxの値次第で、変換後のビットレートはだいたい700k前後になるようです。

-g 600

GoPサイズの指定。(ちゃんと理解できてないのですが、)たぶん600を指定すると30fpsの動画で20秒おきにIフレームが入る。-g 300と比較して2MByteほど小さくできる模様。

変換速度の比較

core i7 3770 (Ivy) → x1.8前後
core i5 9400F(coffeeLake Refresh) → x4前後
RX580 → x10前後
ただし、変換する動画の種類やパラメータによって変動します。
ハイエンドのGPUを使えばもっと高速にエンコードできるかもしれませんが、バスボトルネックで思ったよりも速度が出ないかもしれません。(お金に余裕のある方は試してみてください)まぁ、10分の動画を60秒前後でエンコードできるわけですし、殆どの方はRX570やRX580で満足できるかと思いますが。

画質が‥

その後、いくつかの動画をチェックしたところ、やっぱりブロックノイズが気になるとか、圧縮率がlibx265に比べると悪いようで、多少時間がかかってもCPUエンコードのほうが良いという結果でした。


なんか、もうCPUはi3あたりでいいんじゃないかとか思ってしまいます。
やっぱり高速なCPUは必要!( ゚Д゚)
というわけで、次回はAVIUTLでGPUエンコードでやる方法を解説しますん

0 件のコメント:

コメントを投稿