x264のお勉強(その2)

オプションについてのお勉強第二段。

レートコントロール


大項目としては「量子化制限設定」と「シーンカット設定」「ビデオバッファ検証器」がある。

量子化制限設定

主にビットレート指定で圧縮する際に使われる設定。
ビットレートを指定して圧縮する場合、情報量の少ない場面(全く動いていない絵が続くとか)ではQPの値を上げてデータ量を節約し、情報量の多い場面(動きの多い部分)のデータ量を増やして品質を一定にする。
ここの数値はそれらをどれだけ制限するか、というもの。
なのだが・・・x264の吐くログを見る限り、ROの動画ではほとんど意味がない設定のような気がする・・・
(QPの変動は1フレーム間でせいぜい1〜2。全体を通しても平均値の±5程度に収まっている)

  • QP下限値・・・1フレームの品質の上限。ビットレート15M指定の時はIとPがこの数字に張り付いていた。
  • QP最大値・・・1フレームの品質の下限。1M指定の時でも51の指定に対し最大値は37だった。
  • QP変動値・・・1フレーム間でQP値をどこまで変動させるかの制限。Iフレームに移行する時にはこれを無視してQP値は引きあがる。
  • 輝度-彩度間オフセット・・・輝度と彩度で別のQP値を用いる。人の目は輝度に敏感なのでそちらの情報量を増やそう、という意図か(全体を通すとバランス悪くなりそうだけど・・・)。
  • インター輝度量子化無効領域・・・おそらくdeadzone_interの事だけど、どうやったら設定できるんだろう?(グレーで触れない)
  • イントラ輝度量子化無効領域・・・deadzone_intraの事か?やはり設定できない。

ちなみに「インター」とは「画面間」、「イントラ」とは「画面内」と読み替えると以降少しは雰囲気がつかめるんじゃないかな?
量子化無効領域ってのは・・・DCT変換などで濃度の濃い部分だけ吸い出したあとの薄い部分を何処まで残すか?ってことか。

シーンカット設定

Iフレームの更新タイミングの設定。
シークで飛ばせるシーンの間隔の設定ともいえるし、データ量の馬鹿でかいIフレームをどれくらい残すのかという設定でもある。

  • シーンカット閾値・・・追加でIフレームを入れるタイミングの指定。大きな値ほどIフレームを入れようとする・・・がROのような画面ではほぼ意味なし(15Mの設定でも追加のIフレームは0だった)
  • IDRフレーム最小間隔・・・シークの最小フレーム間隔。数値が小さいほどシークで早く次の画面に飛ばせる。
  • IDRフレーム最大間隔・・・シークの最大フレーム間隔。大きすぎるとシークで画面が出てくるのに時間がかかる。

実際にはIDRは最小値〜最大値の間で任意に選ばれる。実際のfpsを考慮して決定しよう。

ビデオ・バッファ検証器

VideoBuffer Verifierに関する設定・・・なのだが意味不明(笑)
動画の2pass以降に使用する分析結果(「ここら辺は動きが激しくてあっちはほとんど静止画」とか)を元にQBの制限とかを反映させる為の機構・・・なんだと思う。
オプションで言うvbv_maxrateやらvbv_bufsize、vbv_initの事か。

  • VBV最大ビットレート・・・平均化区間内のビットレート
  • VBVバッファサイズ・・・平均化区間のサイズ。↑の設定をするなら必ず設定しなければならない。
  • VBV初期バッファ・・・VBVで再現されるデータ量がこれを超えるとQP値を引き上げる必要があると判断される・・・らしい(笑)

VBV最大ビットレート・VBVバッファサイズは0だとx246にお任せするのかな?
VBV初期バッファは意外と効いてくる数字かも。ちなみに本家のDefaultは90%。


追記:
猫科研究所 - x264(nal-hrd),H.264/AVC(HRD),MPEG-1/2(VBV)
VBVについて判り易く書かれた記事があったのでリンクしてみる。
古い記事なので触る気は無かったけれど、意外とここへ飛んでくる人が多いもので・・・

マクロブロック&フレーム


「マクロブロックタイプの指定」と「Bフレーム設定」がある。

マクロブロックタイプの指定

マクロブロックについて詳しく書くとSliceの概念やらI-Slice・P-Slice・B-Sliceの違いなどかなり足を突っ込まなければならない。
ので、ここでは簡単に「次のコマで参考にする絵の最小単位」と考える事にしよう(そういう意味だと、この項目にふさわしくないのが3つほどあるけど(笑))。

  • 8×8 離散コサイン変換・・・8×8でのDCT変換をする。今まで1回でろ過して情報を取り出していたものを、4回に分けて取り出すようにする。結果、濃度0.5×4だったものが0.3・0.4・0.5・0.8に分けられる(=個々の再現力が高い)。
  • 8×8,8×16および16×8 Pフレーム動き補償・・・P-Sliceで使うブロックを更に細かく分ける。
  • 8×8,8×16および16×8 Bフレーム動き補償・・・B-Sliceで使うブロックを更に細かく分ける。
  • 4×4,4×8および8×4 Pフレーム動き補償・・・P-Sliceで使うブロックをとても細かく分ける。
  • 8×8 イントラ動き予測・・・同じフレームからコピーしてくるサイズを8×8も許可する。
  • 4×4 イントラ動き予測・・・同じフレームからコピーしてくるサイズを4×4も許可する。

誤解を招くのを承知で私の理解するSliceを説明すると・・・

  • I-Slice・・・一枚の絵(でも細かく見ると同じ絵の中の部分部分の切り貼り・使いまわしだらけ)
  • P-Slice・・・前の絵に上書きする新たな絵(でも前の絵の使いまわしがいっぱい)
  • B-Slice・・・前の絵(や後の絵)から切り取って動かす絵、の切れ端。切れ端はそれぞれを右に動かしたり左に動かしたり出来る。

使いまわす絵を細かくすればするほど細かい部分はきれいに見えるけど、その分情報量は多くなる。
多くなった情報量はビットレートに影響を与え、絵そのものの情報量を減らしていく。
ROのようにビット毎に区切りのある映像だと細かい部分が見えるほどきれいに目に映るので、4×4とかもonにしておくといいのかな?

Bフレーム設定

少ない情報量だけどその分汚い絵のBフレームをどのくらい使うか、の設定。

  • 最大連続数・・・Bフレームをいくつ続けてよいかの指定・・・なのですが、いくつを指定しても今まで作ってきた動画は全て1以上にならない。何故?!
  • 偏倚・・・効果の少ないBフレームを間引かない判断の基準。増やせばBフレームの使用頻度が上がる。
  • フレーム参照・・・Bフレームのデータも他のBフレームで使いまわすことが出来るようになる。AVIファイルだと音ズレの原因になる(音をいじればAVIでも問題はない)。
  • 双方向動き予測(ME)・・・前後の映像の平均の画像も元の絵との比較対象にする。圧縮率はよくなるが絵の質は落ちる。
  • 適用的Bフレーム挿入・・・最大連続数の範囲でBフレームに適するものをBフレームし、適さないものをPフレームとする。
  • 重み付け予測・・・フェードイン・フェードアウトがきれいになる。最大連続数が2以上でなければ効果は無い。
  • 動き予測モード・・・Spatialは2D優先。Temporalは3Dの時間軸も考慮。Autoはどちらがいいか判断してくれる。まぁ、Spatialで良いと思う。

その他


「動き予測設定」と「詳細設定」、「デバッグ」の項目がある。

動き予測設定

動き補償で使えそうな絵を探す方法や範囲の設定。圧縮にかかる時間に与える影響がとても大きな所。
(何も考えずに圧縮したら1.5時間の動画圧縮に12時間以上かかりましたzzz)

  • 動き予測アルゴリズム・・・絵がどう動くか予測の方法を決定する。これまた難しい話なので簡単にすると、数が大きいほど細かな(1/2とか1/4)動きを予測できる(=質が高くなる)。
  • 予測方法・・・モードは全部で4つ。Uneven Multi-HexagonとExhaustive Searchは検索範囲の半径指定が可能。
    • 上下左右の方向だけ検討する高速なDiamond Search
    • 6方向に2マスだけ探すHexagonal Search
    • 非常に合理的に周囲を見渡すUneven Multi-Hexagon
    • 愚直に全検索を行うExhaustive Search
  • 検索範囲・・・予測方法がUneven Multi-HexagonかExhaustive Searchだと設定可能。距離が長いほど検索時間が長い。
  • 最大参照フレーム数・・・動作予測に使用する前後フレームの最大値。
  • 参照フレーム・・・「mixed_refs」の事かな? 8×8や8×16のマクロブロックをいろんな所から別々に取ってこれるようになる。
  • 彩度動き予測・・・動き予測を輝度だけでなく彩度でも行う。
  • BフレームのマクロブロックタイプにRDOを使用する・・・オプション名が長い(笑)。Bフレームでも精度の良い動き予測アルゴリズムを使用する。

動き予測アルゴリズムは6のRDOか7のRDO Level2がお勧め。6だと1〜5以下の1.5倍・7だと2倍の時間がかかるけど・・・
予測方法はUneven Multi-Hexagonで決まり。動きの激しい部分もしっかり追跡して圧縮率を上げたい。
問題は検索範囲。30fpsくらいあればかなり小さな範囲でも追いきれるのだろうけど、12fpsだと同じだけ追うのに2.5倍の範囲が必要な訳で・・・
更に画像が広ければ広いほど探す個数は増えまくる、と(720×480と1024×768では情報量が2倍以上も違う)。
これがどの程度影響あるのかは調べる必要があるな。
最大参照フレーム数も圧縮にかかる時間に非常に影響を与える項目。やはり1と2のデータはあるので3以上にしてどの程度変わるのか調べるか・・・
他のオプションも全てチェック。画質と品質の両立の為ならばエンコードの時間は惜しまない!という設定だな。

詳細設定

他の項目に収まらないその他の項目。でも重要なものもあるので、あまりものと言ってバカにはできない。

  • サンプルアスペクト比・・・実際に表示させる時の縦横の比率。1:1が望ましいでしょ、やっぱ。
  • スレッド・・・同時に処理する量。CPUの数だけ増やせばそれだけ早く圧縮が終わるようになる。
  • CABAC・・・色々処理して出来たデータをぎゅぎゅっと圧縮するCABACを使う。今のCPUの処理速度なら使っていけない理由はない。チェックしないとファイルサイズが1割増える。
  • 歪み補正・・・レート歪最適化。粗の目立ちそうな部分の情報を多くしてやろうという微調整。trellis=2の設定かな? onにしよう。
  • ノイズ除去・・・DCT変換してるんだからついでにノイズフィルターもしちゃえ、的な発想か? ノイズはちゃんと前処理した方がいいと思うので0で・・・
  • ブロッキングフィルタ・・・違うところから持ってきた絵を並べたら境目が目立つから誤魔化そう!って考え。そんなに目立ってないからoffでいい(笑)
  • インターレース保持・・・インターレースの説明とかいるけど、PCの画面なら必要ないのでパス。だからoff。
  • Pフレームを早い段階で省略しない・・・指定すれば高圧縮にすると平坦部にでるノイズ(残像)を残さなくなる。常にonでいいんじゃないかな?
  • Pフレームで係数の閾値化を無効・・・--no-dct-decimateのことかな? 計算結果をいじって細かいものを消してしまうのを防ぐ。やっぱり常時onで。

デバッグ

吐き出すログとFourCCの設定。

  • ログレベル・・・エラーの通知のみでもいいけど、InfoやDebugにすると細かいデータが見れる。でも、バッチ処理とかするならErrorでok。
  • FourCC・・・ここを変えると再生できなくなるので変えないように!


(参考にした資料)
ageha was here
Diary 2007-7
MPlayer and MEncoder on MacOSX - MPlayer and MEncoder on MacOSX
http://www.geocities.jp/encmemo5whf6jvag8/
How to Use ffmpegXメモ was here (2005/04~2006/08)
MPEG Technologies
デジタル映像の「アーカイブ&デリバリー」に関する技術情報サイト|mpeg.co.jp > MPEGラボ > 第20回
http://www.katch.ne.jp/~kakonacl/douga/h264/h264.html
AviUtl実験室 - AviUtl実験室
http://head.egoism.jp/codec/h264/index.htm
思うところ2005