一応試訳してみたものの、原文は初心者向けの方便やたとえ話がきっぱりと無く、数学固有の用語や言い回しもありそうです。
【原文】x264 core:50 svn-560M ソースコード内、"x264/Doc/ratecontrol.txt"
~~~~~~~~~~~~~~~~~~~~~~~~試訳ここから。
x264のレートコントロール方式の性質概要
Loren Merritt
x264のレートコントロールはlibavcodecのそれをベースにしている、これはおおむね経験的なものだ。しかし理論としてはほとんどのアルゴリズムの背景には次のようなポイントがあると言えるだろう。
固定画質アプローチ(*constantquality、CQ*) を望む人は多いだろう。しかし、固定画質で均一なPSNR(*Peak Signal to Noise Ratio、画質の指標で高い程良い*) やQP(*量子化値*) が得られるわけではない。複雑なシーンや動きの多い場面ではディテイルが目にとまる事は少ないので、そうした部分でより高いQPでビットを節約し、少し画質を落としても解らないのだ。 一方、動き補償がよく効くシーンにこれらのビットをまわせば1ビットあたりの画質は向上する。動きの少ないシーンではその結果生じるアーティファクトが数秒続くだろうが、シーン全体の画質を向上させるには1フレームを補正するだけで済む。 上記二つは、あるフレームを指定されたQP値で符号化するのに必要なビット数と相関関係にある。 あるフレームを符号化する際、様々なQPでそれを符号化した場合に必要になるビット数を予測する事が出来る。この予測精度はQPs(*maxとminか、qp_step?*) の差が大きい程下がる。 あるフレームの重要度は、そのフレームを基準に予測されたフレームがどれだけあるかで決まる。従って、Iフレームに適用されるQPは後続のインターフレームの複雑さとその数に応じて減らされる。disposableBフレームにはPフレームより高いQPが適用される。参照BフレームのQP値はPフレームとdisposable Bフレームの間になる。 *disposalB-frames:{捨てても良い、使い捨ての} どこからも参照されていないBフレームと思われ。 モード: 2pass: 1stパスから得たデータ(例えば後述の1passABR)を元に、指定されたサイズの範囲で最大の画質になるようQP値を選択するべく試みる。この工程は3つに別れる。 (1)2ndパスを始める前に、各フレームに割り当てるビット量の比率を決める。ここでは最終サイズを考慮しない。デフォルトの式は"complexity ** 0.6"。これは2つの理論的なポイントから経験的に選ばれたバランスで、complexity(*複雑さ*) は対象フレームを固定QPでエンコードした時のビット数(1stパスの結果から推計する)。 (2)指定ファイルサイズに見合うように上記の結果を弄る(*スケーリングする*) 。オプションとして、VBV(*VideoBuffer Verifier、ビデオバッファ検証器*) に制限をかける事ができる。フレームサイズ予報器と VBV内部でのノンリニア性の為、このプロセスは反復(* iterative、反復相?*) だ。 (3)エンコードの開始。各フレームのエンコードが終わる都度、予測サイズのぶれを補正するためにその先のQPは補正される。2ndパスで予想より小さなサイズが続いた場合(一般的に2ndでは圧縮効率の良い、遅いオプションを使う)、エラーの相関関係(*reciprocal、逆数?*) を使って将来フレームのqscaleを拡大する。加えて、開始点付近から終了点付近まで、希望サイズから大幅に逸脱しない為の短期間補償がある(開始点には全体的な補償のために充分なデータが無く、終了点にはgrobalが反応するだけの時間が無い)。 1pass, average bitrate(*ABR、平均ビットレート*) : 目標は2passと同じだが1stパスが無いのでエンコードとレートコントロールを同時にやる事になる。 (1)2passと同じ。ただし、1stパスから複雑さを予測する代わりに、各フレームにハーフ解像度の高速動き予測を行い、SATD residuals(*SATDの残り?*) を使う(これはPB間の差を決めるのにも使う)。また、後続GOPのサイズや複雑さも事前には解らないのでI-フレームの優遇ボーナスも過去から推測する。 (2)将来フレームの複雑さが解らないので、過去フレームの状況からscaleする。scaling因数は過去の全フレームに適用されていたら指定ビットレートに収まったであろう値が選択される。 (3)オーバーフロー補償も2passと同じ。補償の強さを調整することで、「2passに近い画質(ただしサイズは+-10%のように予測不能)」から「指定サイズぴったりだが画質に劣る」までの範囲に調整できる。 1pass,constant bitrate (VBV compliant)(*固定ビットレート、(VBV互換)*) : (1)ABRに同じ (2)scaling因数は、過去の全フレームの代わりに、ローカル平均値(VBVバッファサイズに依る)を元に算出する。 (3) Overflow compensation is stricter, and has anadditional term tohard limit the QPs if the VBV is near empty. Note that no hard limit isdone for a full VBV, so CBR may use somewhat less than the requestedbitrate. Note also that if a frame violates VBV constraints despite thebest efforts of prediction, it is not re-encoded. (3)オーバーフロー補償はより厳格で、さらにVBVがカラッポに近い場合はQPにハードリミットがかかる。VBVがフルの場合はハードリミットがかからない事に注意。従ってCBRは指定値よりやや低いビットレートを使いがち。また、あるフレームがVBVの制限を超えてしまった場合でも再エンコードはされ無い事にも注意。 1pass,constant ratefactor(*固定レート因数/係数*) : (1)ABRに同じ (2)scaling因数は、 --crf の指定値に基づく固定値。 (3)オーバーフロー補償は無い。 *参考:
-x264encopts crf 1passを使うなら、crfが実用的だと思います。ビットレート指定を付けるとぴったしとは行きませんが、まぁまぁ考慮してくれます。
constant quantizer(*固定QP、固定量子化値、など*) : QP値を単純にフレームタイプで決める。 all modes: H.264 allows each macroblock to have a different QP. x264does not doso. Ratecontrol returns one QP which is used for the whole frame. H.264はマクロブロック単位でQPを変える事ができるが、x264では採用していない。QPはフレーム単位だ。1フレーム内部の全マクロブロックに単一のQP値を使う。 ※画質的にはマクロブロック単位QPのほうが有利と思われる。例えば画面右半分が静止画像、左半分が激しく動く場面など。この差はHDTVで効いて来ると思う。反面、実装は地獄じゃろうねぇ。 ※1フレーム内にIPBスライスが混在しているハズだが、そっちのほうは大丈夫なのだろうか? ~~~~~~~~~~~~~~~~~~~~~~~~試訳ここまで。
スポンサーサイト