オプション(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