VP9(libvpx-vp9) のエンコード設定について


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

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

webmproject/libvpx: github.com
Downloads – Opus Codec
CompilationGuide/Quick/libopus – FFmpeg

基本コマンド

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

linux などの 1pass 目の例
ffmpeg -i input -c:v libvpx-vp9 -crf 30 -b:v 0 -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

ビットレート指定

以下の設定のどれかを必ず指定する

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

エンコード設定

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

Encoder libvpx-vp9 [libvpx VP9]:
    General capabilities: delay threads 
    Threading capabilities: auto
    Supported pixel formats: yuv420p yuva420p yuv422p yuv440p yuv444p gbrp
libvpx-vp9 encoder AVOptions:
  -auto-alt-ref      [int]        E..V.... Enable use of alternate reference frames (2-pass only) (from -1 to 2) (default -1)
  -lag-in-frames     [int]        E..V.... Number of frames to look ahead for alternate reference frame selection (from -1 to INT_MAX) (default -1)
  -arnr-maxframes    [int]        E..V.... altref noise reduction max frame count (from -1 to INT_MAX) (default -1)
  -arnr-strength     [int]        E..V.... altref noise reduction filter strength (from -1 to INT_MAX) (default -1)
  -arnr-type         [int]        E..V.... altref noise reduction filter type (from -1 to INT_MAX) (default -1)
     backward                     E..V....
     forward                      E..V....
     centered                     E..V....
  -tune              [int]        E..V.... Tune the encoding to a specific scenario (from -1 to INT_MAX) (default -1)
     psnr                         E..V....
     ssim                         E..V....
  -deadline          [int]        E..V.... Time to spend encoding, in microseconds. (from INT_MIN to INT_MAX) (default good)
     best                         E..V....
     good                         E..V....
     realtime                     E..V....
  -error-resilient   [flags]      E..V.... Error resilience configuration (default 0)
     default                      E..V.... Improve resiliency against losses of whole frames
     partitions                   E..V.... The frame partitions are independently decodable by the bool decoder, meaning that partitions can be decoded even though earlier partitions have been lost. Note that intra predicition is still done over the partition boundary.
  -max-intra-rate    [int]        E..V.... Maximum I-frame bitrate (pct) 0=unlimited (from -1 to INT_MAX) (default -1)
  -crf               [int]        E..V.... Select the quality for constant quality mode (from -1 to 63) (default -1)
  -static-thresh     [int]        E..V.... A change threshold on blocks below which they will be skipped by the encoder (from 0 to INT_MAX) (default 0)
  -drop-threshold    [int]        E..V.... Frame drop threshold (from INT_MIN to INT_MAX) (default 0)
  -noise-sensitivity [int]        E..V.... Noise sensitivity (from 0 to 4) (default 0)
  -undershoot-pct    [int]        E..V.... Datarate undershoot (min) target (%) (from -1 to 100) (default -1)
  -overshoot-pct     [int]        E..V.... Datarate overshoot (max) target (%) (from -1 to 1000) (default -1)
  -cpu-used          [int]        E..V.... Quality/Speed ratio modifier (from -8 to 8) (default 1)
  -lossless          [int]        E..V.... Lossless mode (from -1 to 1) (default -1)
  -tile-columns      [int]        E..V.... Number of tile columns to use, log2 (from -1 to 6) (default -1)
  -tile-rows         [int]        E..V.... Number of tile rows to use, log2 (from -1 to 2) (default -1)
  -frame-parallel    [boolean]    E..V.... Enable frame parallel decodability features (default auto)
  -aq-mode           [int]        E..V.... adaptive quantization mode (from -1 to 4) (default -1)
     none                         E..V.... Aq not used
     variance                     E..V.... Variance based Aq
     complexity                   E..V.... Complexity based Aq
     cyclic                       E..V.... Cyclic Refresh Aq
     equator360                   E..V.... 360 video Aq
  -level             [float]      E..V.... Specify level (from -1 to 6.2) (default -1)
  -speed             [int]        E..V....  (from -16 to 16) (default 1)
  -quality           [int]        E..V....  (from INT_MIN to INT_MAX) (default good)
     best                         E..V....
     good                         E..V....
     realtime                     E..V....
  -vp8flags          [flags]      E..V....  (default 0)
     error_resilient              E..V.... enable error resilience
     altref                       E..V.... enable use of alternate reference frames (VP8/2-pass only)
  -arnr_max_frames   [int]        E..V.... altref noise reduction max frame count (from 0 to 15) (default 0)
  -arnr_strength     [int]        E..V.... altref noise reduction filter strength (from 0 to 6) (default 3)
  -arnr_type         [int]        E..V.... altref noise reduction filter type (from 1 to 3) (default 3)
  -rc_lookahead      [int]        E..V.... Number of frames to look ahead for alternate reference frame selection (from 0 to 25) (default 25)

この中で重要なのがエンコード速度と品質に関わる 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]
既定値:-1

qmax [int]
既定値:-1

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

keyint_min [int]
既定値:-1

colorspace [string]

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

推奨ビットレートと品質設定

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

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 がない代わりに alternate reference frames がある
Instructions to playback Adaptive WebM using DASH – wiki DASH向けにエンコード
VP9 Encoding Guide – wiki エンコード設定
The WebM Project | VP8 Encode Parameter Guide エンコード設定

コメントを残す

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

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