x264のお勉強

最近動画の圧縮に使っているコーデック、x264について調べてみる。
2008/01/03に最新のx264が出ているようが、本家のものはvfwに対応していないのでAVI形式を作成する場合別途dllが必要。
日本語化されているものはhttp://www12.atwiki.jp/lunatilia/http://seraphy.fam.cx/~seraphy/index.shtmlで公開されている。
ここではx264vfw encoder Lunatilia build版(rev. 7.18)を使用するものとする。
設定できる項目はいくつかあるので、タブ毎にどういう内容なのか見てみよう。

ビットレート


大きく分けて良く変更する「一般設定」と触る事の少ない「ビットレート設定」がある。

一般設定

最も頻繁に触る項目である品質の指定(平均ビットレートとか品質)とエンコードの方法がある。
エンコードの方法には、一回で圧縮してしまう「Single Pass」と、事前に解析したデータを基に精度の高い圧縮を行う「Multipass」がある。

  • Single Pass
    • Single Pass - ABR・・・平均ビットレートを指定した1pass。ファイルサイズが予想しやすいのがメリット。
    • Single Pass - Const.Quantizer (qp)・・・品質を指定した1pass。
    • Single Pass - Const.Quality (crf)・・・↑と似ているが、(フレーム間予測を使わない)Iフレームの品質を重視した1passか。
  • Multipass
    • Multipass - 1st Pass・・・一番最初に行うデータ解析。Multipassならこれを行わないと次に進めない。
    • Multipass - 1st Pass (Turbo)・・・↑の高速バージョン。速くなる分データ精度が落ちるらしい。(使ったことは無い)
    • Multipass - Nth Pass・・・解析したデータを基に実際にエンコードを行う。何回でも出来るが1回すれば十分なものが出来る。

passを重ねるごとに「画面毎のビットレート」が最適化されて、品質は向上していく・・・が、その変化は微々たるものなので2passで問題ない。


品質の指定は「平均ビットレート」(「Single Pass - ABR」と「Multipass〜」)と「品質」(「Single Pass - Const.〜」)がある。
「品質」の項目はイメージし難い(0で可逆圧縮になるようなので、恐らくDCT変換で切り捨てる項目数*1とかIフレームに対するPフレームBフレーム数が関係していると勝手に予想)。
アニメなどでは20〜22程度、実写画像なら24〜28程度でも特に不満を感じない動画が得られるらしい。
「平均ビットレート」は文字通り1秒でどのくらいのデータ量にするのか、の指定。この数字と動画の秒数を乗算すれば仕上がりのファイルサイズが予想できる。
ちなみに2pass目以降の仕上がりのファイルサイズが気に食わなければ、「Multipass - Nth Pass」で「平均ビットレート」を変更して再エンコードできるようだ(要検証)。


Multipassの場合、ステータスファイルを作る。これを更新しなければ次のpassに解析結果を反映できないので、基本的にはチェックしておく。
2pass目でこれを更新していなければ、3pass目を指定しても1pass目の解析データを基にエンコードする為2pass目と同じ結果となるだろう。
ステータスファイル名を変更する事も出来るが、Multipassを連続して行うならば特に変更する必要はない。

ビットレート設定

ファイルサイズに大きな影響を与える項目。内容はかなり専門的なものだが、勘と経験で数字を調整できるだろう。

  • キーフレーム品質上昇率・・・圧縮率が低いが画像の劣化の少ないIフレームの割合の最大値を指定。
  • Bフレーム品質減少率・・・圧縮率が高いが画像の劣化の多いBフレームの割合の最大値を指定。
  • 量子化圧縮率・・・DCT変換後に残す項目の量の事なのかな? *2
  • ビットレート変動率・・・動きの少ない画像でどのくらいビットレートを落とすか、の指定。

デフォルトの設定を見ると、

  • キーフレームをかなり多くして動きの少ない部分の品質も上げている(動きの激しい画面でIフレームは消費されやすい)。
  • Bフレームを抑える事で圧縮率よりも画質を重視
  • 量子化圧縮率を高めにして損失するデータ量を抑える(品質で25相当?)
  • ビットレート変動率を100%にする事で、場面場面の画像の質を均一化し、静止部でも品質を維持

と、映像の品質をかなり重視した設定のようだ。このビットレートだと、動きの大きな320×240×64k色程度の画像を想定しているのかな?
(薄っぺらい根拠は↓zzz キーフレーム品質上昇率とBフレーム品質減少率・量子化圧縮率が品質に与える影響が、これでなんとなく掴めないかな?)

映像1枚のサイズを想像する。
とある資料によると、データサイズはPフレームはIフレームの3/8、BフレームはIフレームの1/12程度。
設定を忠実に再現できるとIフレーム70%・Bフレーム9%・Pフレーム21%。
全てがIフレームの時と比較すると、(Iフレーム)70%×1+(Pフレーム)21%×3/8+(Bフレーム)9%×1/12で78.6%。
これを仮にI-PB係数とすると・・・
1フレームの情報量=2.6Mbps÷フレーム数(30fpsかな?)÷CABAC圧縮率(15%くらいかな?)÷量子化圧縮率(60%)÷I-PB係数(78.6%)=約160kバイト。
320×240×65535色のデータは153.6kバイトの情報量を持っているので、ほぼ期待通りの画像が仕上がることになるだろう。

一つの項目で長すぎ! なのでここまで

*1:DCT変換とはパターンのある情報から濃度の濃い部分(行列の左上)〜濃度の薄い部分(行列の右下)を得る方法。徐々に色が変化するようなデータならば後の方の情報ほぼ意味無い<専門の人に怒られそうな説明だな

*2:符号化のCABACは可逆圧縮(算術圧縮?)のはずだから圧縮率の指定は出来ないんじゃないかな? 情報不足zzz