それは置いといて、
これまで動画のエンコードには、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は必要!( ゚Д゚)
というわけで、次回はAVIUTLでGPUエンコードでやる方法を解説しますん
0 件のコメント:
コメントを投稿