QSV、NVENC、とはなんぞや。(エンコード関連)その3

しばらく使いながら、少しづつ変更しながら、やっと落ち着いたエンコードが次になります。

基本は、リサイズせず、大きな画像崩壊を起こさない程度で、30分で400MB程度に収まるように(大体ビットレートが1500kbpsくらい)しています。

最初はCQ(品質指定)で行う予定でしたが、私の理解が追い付かず、細かい指定がうまくできなかったのでビットレート指定でのVBRで行っています。

/usr/local/bin/ffmpeg /
	-hide_banner /
	-ignore_unknown /
	-dn /
	-y /
	-vsync 0 /
	-hwaccel cuvid /
	-analyzeduration 200M /
	-probesize 200M /
	-c:v mpeg2_cuvid /
	-deint adaptive /
	-drop_second_field 1 /
	-i 入力ファイル /
	-movflags faststart /
	-sn /
	-c:v hevc_nvenc /
	-vf hwdownload,format=nv12,yadif=0:-1:0,hwupload_cuda /
	-preset slow /
	-b_ref_mode 2 /
	-rc vbr_hq /
	-cq 23 /
	-qmin 15 /
	-qmax 40 /
	-qcomp 0.6 /
	-b:v 1.5M /
	-maxrate 20M /
	-rc-lookahead 50 /
	-i_qfactor 0.75 /
	-b_qfactor 1.1 /
	-spatial_aq:v 1 /
	-aq-strength 15 /
	-af volume=0dB -c:a aac -ar 48000 -ab 192k -ac 2 -bsf:a aac_adtstoasc /
	-fflags +discardcorrupt /
	出力ファイル

解説は必要ないと思いますが、数か所あります。

  • -vf:インターレース解除をするために、yadifを指定しています。hwdownload/hwuploadの意味がいまだに解ってないので、実際に動かしてエラーが出なかったこの書き方になってます。間違っているかも知れません。引数なんかは、 ニコラボ | niconico と ffmpeg のことを中心に書いてる を参考にしました。
  • -af:音声についてですが、音量が小さいものもあったので、ffprobeをつかって、音量をなるべく大きくできるようにしてます。今回は0dBに固定してますが、実際は変数にして放り込んでます。
  • -b:v 1.5M -cq 23 -qmin 15 -qmax 40 -qcomp :本来なら、cqを指定した場合は、品質指定モードなので、ビットレートは指定せず、0を引数で与えるのが正しいそうですが、それでは希望通りにいかなかったので、やむを得ずビットレート1.5Mを指定しています。この場合、cq、qmin,qmax,qcompはお飾りとなって、意味を持ちませんが、おまじないとして残しています。意味はないです。

ちなみに、cq38くらいにすれば、ビットレート2Mくらいになりました。