次世代エンコーダ VP9(webm) のエンコード設定について ffmpeg で使ったときの設定をまとめた。libvpx-vp9 は外部ライブラリなので別途インストールする必要がある。さらに音声のエンコーダで使われる libopus も外部ライブラリなのでこれもインストールする必要がある。

設定内容は多くあるがほとんどの設定は何も変えず、ビットレートの設定と品質・速度のトレードオフの設定を変える。VP9 で処理が遅いとよく言われるが、これは仕様上、現在ではどうにもならないので2つ3つ同時にエンコードして1つにつなげる方法をとれば処理は速くなる。それでも threads を設定することで早くなる。libx264 のように自動設定しないので一番下の方にある解像度に併せて設定する。

libvpx-1.7.0 から 10, 12ビット深度に対応した。

webmproject/libvpx: github.com
Downloads – Opus Codec

VP9コーデックメモ – Qiita

基本コマンド

ffmpeg -i input -c:v libvpx-vp9 -crf 30 -qmin 3 -qmax 40 -b:v 0 -threads 3 -c:a libopus -b:a 128k output.webm
libopus をインストールしていない場合。
ffmpeg -i input -c:v libvpx-vp9 -crf 30 -qmin 3 -qmax 40 -b:v 0 -threads 3 -c:a opus -b:a 128k -strict -2 output.webm
2pass エンコード例。
ffmpeg -i input -c:v libvpx-vp9 -crf 30 -qmin 3 -qmax 40 -b:v 0 -threads 3 -pass 1 -f webm -an -f null -
ffmpeg -i input -c:v libvpx-vp9 -crf 30 -qmin 3 -qmax 40 -b:v 0 -threads 3 -pass 2 -c:a libopus -b:a 128k output.webm

linux などの 1pass 目の例。
ffmpeg -i input -c:v libvpx-vp9 -crf 30 -qmin 3 -qmax 40 -b:v 0 -threads 3 -pass 1 -an -f webm /dev/null
分割エンコードしてつなげるコマンド例。
ffmpeg -f concat -safe 0 -i input.txt -c copy output.webm
input.txt の内容

file output-0.webm
file output-1.webm

詳しくは 【ffmpeg】動画・音声を連結する concat の使い方 其の3

高画質にエンコードするには crf, qmin, qmax を下げて、キーフレームを適切に挿入する。
ffmpeg -i input -c:v libvpx-vp9 -crf 18 -qmin 3 -qmax 32 -keyint_min 24 -g 240 -b:v 0 -threads 3 -c:a libopus -b:a 96k output.webm

高ビット深度の場合は出力フォーマットを指定する。
ffmpeg -i input -c:v libvpx-vp9 -crf 18 -qmin 3 -qmax 32 -keyint_min 24 -g 240 -b:v 0 -threads 3 -pix_fmt yuv420p10le -c:a libopus -b:a 96k output.webm

ビットレート設定

以下の設定のどれかを必ず指定するcrf を指定する場合は、qmin, qmax または minrate, maxrate の設定も必ず併用する

  • 平均ビットレート
    -c:v libvpx-vp9 -b:v 1000k
  • 平均ビットレート(上限と下限指定)
    -c:v libvpx-vp9 -b:v 2000k -minrate 1500k -maxrate 2500k
  • 品質指定(-1 から 63 まで低い値ほど高品質) -b:v 0 は必須項目
    品質指定をしながら、平均ビットレートを指定せず -b:v 0 に上限ビットレート maxrate の指定はできない
    -c:v libvpx-vp9 -crf 30 -b:v 0 -qmin 3 -qmax 40
  • 品質指定で上限ビットレートを指定する。最大品質が -crf 30 で平均ビットレートが 1000k になる
    -c:v libvpx-vp9 -crf 30 -b:v 1000k -qmin 3 -qmax 40
  • 品質指定で上限と下限ビットレートを指定する。最大品質が -crf 24 で平均ビットレートが 2000k になる
    -c:v libvpx-vp9 -crf 24 -b:v 2000k -minrate 1500k -maxrate 2500k
  • 固定ビットレート、最小と最大を一致させる
    -c:v libvpx-vp9 -b:v 1000k -minrate 1000k -maxrate 1000k
  • ロスレス(可逆圧縮)
    -c:v libvpx-vp9 -lossless 1

エンコード設定

ffmpeg -h encoder=libvpx-vp9 で見られるエンコード設定とエンコーダ全般に指定できる設定の2つがある。以下は libvpx-1.7.0 より

この中で重要なのがエンコード速度と品質に関わる cpu-used, speed, quality と、馴染みのある crf である。cpu-used, speed はエンコード速度と品質に大きく影響する設定である。既定値は 1 で両方とも 0 にするとものすごくエンコード速度が落ちる代わりに圧縮率が向上する。値を上げるとそれだけ速度が向上するが品質も悪くなる。品質と速度の面から 2 や 3 も候補になるが 4 の品質はよくない。マイナスも指定できるがプラスの時と出力内容は変わらない。また quality realtime を指定することで 5 以上の設定もできる。

cpu-used [int]
マイナスも指定できるがプラスの時と出力内容は変わらない。0 にすると最高品質だがものすごく遅くなる。quality の既定値である good のときは -4 から 4 までしか効果が無い。quality realtime にすると -8 から 8 まで効果がある
範囲:-8 から 8 まで
既定値:1

speed [int]
マイナスも指定できるがプラスの時と出力内容は変わらない。0 にすると最高品質だがものすごく遅くなる。quality の既定値である good のときは -4 から 4 までしか効果が無い。quality realtime にすると -8 から 8 まで効果がある
範囲:-16 から 16 までとあるが、実際は -8 から 8 まで
既定値:1

quality [int]
品質指定。cpu-used, speed の設定を受け付けない best(一番高品質一番低速度)、good 既定値、realtime の3つの指定が出来る。設定を細かく分ける場合に realtime を指定する。
指定値:best, good, realtime
既定値:good

crf [int]
品質の数値指定。小さい値ほど高画質
範囲:-1 から 63 まで
既定値:-1

libvpx-vp9 の設定以外に品質の上限下限の指定と、キーフレーム間隔、色空間がある。

qmin [int]
品質の上限指定。小さい値ほど高画質になる。crf を参考に設定する
既定値:-1

qmax [int]
品質の下限指定。大きい値ほど低画質になる。crf を参考に設定する
既定値:-1

g [int]
keyint のこと
既定値:-1

keyint_min [int]
既定値:-1

threads [int]
下にある解像度に合わせて設定しないと速度が上がらない
指定値の2の累乗になるので3の場合は下のグラフの8になる
既定値:-1(自動設定ではない)

colorspace [string]

  • rgb
  • bt709
  • unspecified
  • bt470bg
  • smpte170m
  • smpte240m
  • bt2020_ncl

色空間を明示する場合は -bsf:v vp9_metadata からでも設定できる。しかし現在 master でしか使えない。おそらく ffmpeg 4.1 から使える。
ffmpeg -h bsf=vp9_metadata

color_space[int]

  • unknown
  • bt601
  • bt709
  • smpte170
  • smpte240
  • bt2020
  • rgb

color_range[int]

  • tv
  • pc

ffmpeg -i input -c:v libvpx-vp9 -crf 30 -b:v 0 -qmin 3 -qmax 40 -bsf:v vp9_metadata=color_space=bt709:color_range=tv -c:a libopus -b:a 96k output.webm

推奨ビットレートと品質、スレッド数の設定

Recommended Settings for VOD  |  Google Developers より
ビットレートの下限は指定ビットレートの50%、上限は145%としている

Frame Size/Frame Rate Target Bitrate (VOD, kbps) Min Bitrate (50%) Max Bitrate (145%)
320x240p @ 24,25,30 150 75 218
640x360p @ 24,25,30 276 138 400
640x480p @ 24,25,30 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 1800 900 2610
1920x1080p @ 50,60 3000 1500 4350
2560x1440p @ 24,25,30 6000 3000 8700
2560x1440p @ 50,60 9000 4500 13050
3840x2160p @ 24,25,30 12000 6000 17400
3840x2160p @ 50,60 18000 9000 26100

縦解像度と品質指定(crf)

Frame Height Target Quality (CQ)
240 37
360 36
480 34 (LQ) or 33 (MQ)
720 32
1080 31
1440 24
2160 15

tile-columns と threads の指定

Frame Size Number of tile-columns Number of threads
320x240p 1 (-tile-columns 0) 2 (-threads 1)
640x360p 2 (-tile-columns 1) 4 (-threads 2)
640x480p 2 (-tile-columns 1) 4 (-threads 2)
1280x720p 4 (-tile-columns 2) 8 (-threads 3)
1920x1080p 4 (-tile-columns 2) 8 (-threads 3)
2560x1440p 8 (-tile-columns 3) 16 (-threads 4)
3840x2160p 16 (-tile-columns 4) 24 (-threads 5?)

対応フォーマット

yuv420p, yuva420p, yuv422p, yuv440p, yuv444p, gbrp に対応しているが特に yuva420p のアルファチャンネルは注意が必要で ffmpeg ではデコーダに libvpx-vp9 を指定しないとアルファチャンネルを読み込んでくれない。

アルファチャンネルのある PNG からのエンコード例(画像は連番のファイル名 img-001.png 形式)
ffmpeg -i img-%03d.png -vf format=yuva420p -c:v libvpx-vp9 -crf 30 -qmin 3 -qmax 40 -b:v 0 -threads 3 output.webm
デコード例(入力ファイルの前にコーデックを指定する)
ffmpeg -c:v libvpx-vp9 -i output.webm

バイナリを読む

RAW ファイルコンテナには入れられないが lightweight IVFフォーマットに入れると32バイトグローバルヘッダとフレーム毎の12バイトヘッダで読みやすくなる。ffrprobe で見るときは動画時間が長いと莫大なデータ量になる。
ffmpeg – How to extract raw VP9 stream from WebM file? – Stack Overflow
ffmpeg -i input.webm -c copy stream.ivf
ffprobe -show_packets -show_data -i stream.ivf > show_data.txt

ハードウェアの対応

エンコードでコードのハードウェアの対応
SoCs Supporting VP8/VP9 : wiki.webmproject.org

VP9 の解説記事(英語)

VP9 – Wikipedia VP9 の解説
How VP9 works, technical details & diagrams – Doom9’s Forum VP9 の解説
Do VP9 have B-frame or P-frame ? – Doom9’s Forum VP9 には B-frame がない代わりに altref, golden frame がある
Instructions to playback Adaptive WebM using DASH – wiki DASH向けにエンコード
VP9 Encoding Guide – wiki エンコード設定
The WebM Project | VP8 Encode Parameter Guide エンコード設定

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)