読者です 読者をやめる 読者になる 読者になる

x264のcrfをビットレート推定に使ってる人はいないのかね

雑記

x264によるh.264エンコードで、crf使えばある品質の結果を得るために必要な大体のビットレートがわかるので2pass時のビットレートを推定するのにつかったら便利だと思うんですけど、そういう使い方をしているのを見たことが無いので僕のやってる手順を書いてみます。

1、まずはcrf+激軽オプションで走らせる

"C:\ols\Visual\x264\x264.exe" --crf 23 --level 4 --nf --min-keyint 5 --ref 1
--bframes 3 --b-pyramid --subme 1 --analyse none --qpstep 8 --ratetol 4.0
--qcomp 0.8 --direct spatial --no-dct-decimate --scenecut 60 --me dia 
--thread-input --cqmfile "C:\ols\Visual\MeGUI\tools\x264\test.cfg" --progress
--output NUL %1 --sar 10:11

704x480ピクセルのアニメソース@Pentium4 540(3.2GHz, Prescott)で30fpsくらい出ます。
--sarは4:3で再生するために、--levelはPC以外でも再生できるようにするために付けています(でもどっちもここで付けても意味ないはず)。
いっちょまえにカスタムマトリックスを使ってますが良くなってるのかどうかは疑問です^^;

2、1で表示されたビットレートを1/2〜1/2.5したのを指定してちょい重オプションで1pass目を実行

"C:\ols\Visual\x264\x264.exe" --pass 1 --bitrate 580 --level 4 --stats "%~dpn1.log"
--nf --min-keyint 5 --ref 3 --bframes 3 --b-pyramid --subme 5
--analyse p8x8,b8x8,i4x4 --qpstep 8 --ratetol 4.0 --qcomp 0.8 --direct auto
--no-dct-decimate --scenecut 60 --me hex --thread-input
--cqmfile "C:\ols\Visual\MeGUI\tools\x264\test.cfg" --progress
--output NUL %1 --sar 10:11 --aq-strength 0.8 --aq-sensitivity 15.0

MeGUIのターボモードを参考にしてます。580のところにビットレートを入れます。さっきと同じ条件で10fpsくらい出ます。
--aq-strengthとかはhttp://resic.laburec.net/#20070921からたどれるところでダウンロードできる非公式パッチを当てたx264で使用できるオプションです。
ビットレート配分にかなり影響しそうなので1pass目から入れています。

3、2pass目を激重オプションで

極端に重くなるもの(たとえば--me esa、--fpel-cmp satd)以外のオプションを付けまくって最終エンコード

"C:\ols\Visual\x264\x264.exe" --pass 2 --bitrate 580 --level 4 --stats "%~dpn1.log"
--nf --min-keyint 5 --ref 7 --mixed-refs --no-fast-pskip --bframes 3
--b-pyramid --b-rdo --bime --weightb --subme 7 --trellis 2
--analyse p8x8,b8x8,i4x4,i8x8 --8x8dct --qpstep 8 --ratetol 4.0 --qcomp 0.8
--direct auto --no-dct-decimate --scenecut 60 --me imh --merange 32
--thread-input --cqmfile "C:\ols\Visual\MeGUI\tools\x264\test.cfg" --progress
--output "%~dpn1.mp4" %1 --sar 10:11 --me-prepass --aq-strength 0.8 --aq-sensitivity 15.0

これにも先ほどの非公式パッチ版でしか受け付けないオプションが含まれます。速度は1fps位に落ち込みます。
ソースにもよりますが、これで最終的にglobal PSNRが42〜44くらいでSSIM値が0.98以上になるような出力が得られます。見た目にもほとんどソースと変わりないです。


ここまで書いて気付きましたが上に出た数字は量子化マトリックスによって結構違ってくると思いますので、あんまり参考にならないかも…