[ソフトウェア] ffmpeg+libvpxでVP9(WebM)エンコード:使い方と主要コマンドオプション【動画】

ffmpegとlibvpxでは、微妙に設定の仕方が異なる模様。注意。

また解説サイトによって言っていることがまちまちで、中には公式サイトでもページによって書かれていることが異なる場合もある。

基本的には、自分でいろいろ試しながらやってみるしかない。

-crf:固定品質

値:0~63

(?)Constant Rate Formatの略。

フレームごとに一定のビットレートを保持し、全体のクオリティを高く保つための設定。

名前からすると固定ビットレート(CBR)のようだが実際には異なり、VBRの一種。

動画の質を上げるためにエンコード後の動画サイズや処理負荷を気にしないなら、これを選んだほうがいい。

設定できる値は0~63で、0になるほどクオリティが高い。

同時に「-b:v」を設定できる。-crf時にこれを指定すると、「最大平均ビットレート」を指定することになる。

そのため、-b:vで低めの値を設定すると、-crfの値にかかわらず-b:vの値を基準にエンコードされてしまって意味がなくなるので、同時にかならず「-b:v 0」オプションを指定する

また、少しでも動画のクオリティを上げるためには、下記の-qmin/-qmaxを指定したほうがいい。

コマンドの例:

-vf scale=640x480 -b:v 0 -deadline good -speed 0 -crf 33 -c:v libvpx-vp9 -c:a libopus output.webm

-b:v:平均ビットレート(ABR)

値:数値+M(メガビット)、K(キロビット)

-b:vを指定すれば、おのずとこのABRになる。

全体の平均ビットレートを指定する。要するに、普通のVBR。

-crfと同じく、少しでも動画のクオリティを上げるためには、下記の-qmin/-qmaxを指定したほうがいい。

-deadline

値:realtime, good, best
デフォルト値:good
別名:-quality(ffmpeg)

処理付加と動画クオリティの関係を大まかに決める。

best:エンコードの負荷は大きいが、動画クオリティは最もいい。
good:デフォルト値。大半の場合にはこれで十分。
realtime:高速エンコーディング。ライブ向け。

-cpu-used

値の範囲:0~4(-deadlineがgood/best)、5~8(-deadlineがrealtime)
デフォルト値:0
別名:-speed(ffmpeg)

値が0に近いほど、指定されたビットレートが守られ、動画のクオリティが上がるものの、反対に処理の負荷が多くなる(エンコード時間が長くなる)。

省略されることが多いが、他の設定が同じでもこれが異なると、出力された動画のクオリティが変わってくる重要なオプション。

なお、「0」を指定すると、信じがたいほどに処理に時間がかかる。よほどの理由がない限り、1~4の値を指定するようにしよう。

「4」以上を指定すると、動画を最適化するRate–distortion optimization(RDO)機能がオフになるので注意。

また、-deadlineの指定によって、この-cpu-usedで設定できる値が異なってくる。

2-passでエンコードする場合、パスごとにそれぞれ別の設定をできる。1回目は低めの値でいい(4くらい)。

なお、マイナスの値も指定できるが、プラスの場合となんら変わりない。わかりづらくなるだけなので、使わないようにしよう。

-qmin/-qmax

値:数値+M(メガビット)、K(キロビット)
別名:-minrate/-maxrate

quality minimum/quality maximumの略。ビットレートの下限値と上限値を決める。

-b:vや-crfの値を基準に決める。

ABRのための設定のようにも思えるが、実際には-crfでも使う。できるだけクオリティを上げたい場合は、動画の出力解像度に合わせて両方指定したほうがいい。

主要な参考値はこちら。

ABR

Frame Size/Frame Rate Target Bitrate (VOD, kbps) Min Bitrate (50%) Max Bitrate (145%)
640x360p @ 24,25,30 276 138 400
640x480p @ 24,25,30(VGA) 512 (LQ), 750 (MQ) 256 (LQ) 375 (MQ) 742 (LQ) 1088 (MQ)
1280x720p @ 24,25,30 1024 512 1485
1280x720p @ 50,60 1800 900 2610
1920x1080p @ 24,25,30(フルHD) 1800 900 2610
1920x1080p @ 50,60 3000 1500 4350
3840x2160p @ 24,25,30(4K) 12000 6000 17400
3840x2160p @ 50,60 18000 9000 26100

参考サイト:Google Recommended Settings for VOD

-threads

エンコード時に利用するマルチコアCPUのスレッド数を指定する。

物理コア数のことなのか論理コア数のことなのか、ソフトウェア上のスレッドのことなのか不明。

-lossless:ロスレスVP9(可逆圧縮)

可逆圧縮にする場合は「1」を指定する。

レビュー

情報がひとまとめになっているサイトが公式を含めひとつもなく、非常にわかりづらい。

またffmpegを利用する場合、そちらのコマンド、オプションを覚えなければならない。

この辺の問題も、なかなかWebMが普及しない原因か。

VP9(libvpx-vp9) のエンコード設定について | ニコラボ
最新ffmpeg/高度なオプション – netvista
encoding – Why low qmax value improve video quality? – Stack Overflow