アットウィキロゴ

オプション(Frame-type)

オプション(Frame-type)

-I, --keyint <integer or "infinite"> Maximum GOP size [250]
-i, --min-keyint <integer>  Minimum GOP size [auto]
シーク間隔の指定。
指定がないときの最小間隔は--keyintで指定された数値の1/10かfpsで指定された値になる。(1秒~最大値/10)
また、--min-keyintの値は大きな値を指定しても最大値の半分以下に丸められる.(1~最大値/2)

--no-scenecut           Disable adaptive I-frame decision
--scenecut <integer>    How aggressively to insert extra I-frames [40]
場面転換の感度設定。
IフレームをGOPの開始分(IDR)のみとして残りをPフレーム(とBフレーム)だけとするのが--no-scenecut。
(映像が大きく変化する)場面転換を以下の式で検知し、条件を満たすときにPフレームをIフレームとしている。
(P-frameのビットサイズ) / (I-frameのビットサイズ) > 1 - scenecut(%) × (直前のIDR-frameとの間隔) ÷ 最大GOP値
場面転換ではPフレームのデータサイズが増えるから、ある程度まで大きくなったらIフレームとしたほうがよい。
(場面転換以降はIフレームになった画面を参照できるようになるので、それ以降のPフレーム(やBフレーム)が小さくなると期待できる)
とはいえ、あまり頻繁にIフレームを追加するとデータそのものが大きくなりすぎて品質とのバランスが悪くなるので、IDRとの距離が近いほどPフレームのままにしておこう、というのが上の式。
私個人としては、--min-keyint 1 --no-scenecutでもいい気がするけど、IDR決定の仕組みを理解しないとなんともいえないか。

--intra-refresh
IDRフレームの画(のブロック)を左上から1列ずつ並べていくようにする。ストリーミングではシーク画面がきれいになるけど、右と下方向の参照ができなくなるので画質は落ちそうだ。

-b, --bframes <integer>     Number of B-frames between I and P [3]
--b-adapt <integer>     Adaptive B-frame decision method [1]
--b-bias <integer>      Influences how often B-frames are used [0]

IフレームとPフレームの間にはBフレームが入るのだけれども、これをいくつまで詰め込んでいいかを制限する。
mbtreeが有効ならば、Bフレームが多いほどssim等の値は高くなる(はず)。
これは感覚的な画質が向上する意味ではないことに注意。

b-adaptはBフレームの詰め込み方を指定。
  • 0だとbframesの指定数だけBフレームを入れる
  • 1だと直近の3つのフレームでコストを計算してPフレームにするか判断(計算量はO(n))
  • 2だと2~bframesの値まで全てのコストの最適値を計算してPフレームにするか判断(計算量はO(n^2))

b-biasはBフレーム判定に影響を与えるパラメータで範囲は-90~100。
フレームのコスト算出とb-adapt=1の時のBフレーム判定に影響を与えるようだけど、実際にどんな動作をするのかはソースを詳しく読む必要がある。
  • x264_slicetype_frame_cost()
    • i_score = (uint64_t)i_score * 100 / (120 + h->param.i_bframe_bias);
  • x264_slicetype_analyse()
    • #define P_SENS_BIAS (50 - h->param.i_bframe_bias)
    • pthresh = X264_MAX(INTER_THRESH - P_SENS_BIAS * (j-i-1), INTER_THRESH/10);
最終更新:2011年06月09日 15:07