x264の設定を煮詰めてみる

前回QP値指定でエンコードしてみたけれど、出来上がった動画は7Mbpsと保存用としては少々サイズが大きすぎるのでこれで調整してもしょうがないな〜と。
(出来上がった画は素晴らしく、ぱっと見ただけでは無圧縮AVIのものとの違いは分からないほどでしたが<流石はQP=21)
で、実際に保存する形式で再度設定を煮詰めてみようかと。


エンコードはAviUtl+拡張x264出力(GUI)で行うのは一緒。今度は2pass-1.45Mbpsとし、ベースとしてプリセットの高画質を使用。
今回は比較基準をSSIM値とするので、psychovisualな設定を解除。シーンカットの判定を変えてキーフレームが入りやすいようにしてみた。
この設定を基準として、パラメータを変化させてSSIMの値の変化を比較する。
まずは基本となる設定でのエンコードログ(2passのみ)。

slice I:5 Avg QP:36.20 size: 47025 PSNR Mean Y:31.90 U:38.41 V:38.36 Avg:33.17 Global:32.97
slice P:201 Avg QP:37.90 size: 13316 PSNR Mean Y:29.89 U:36.43 V:36.35 Avg:31.18 Global:31.01
slice B:340 Avg QP:39.72 size: 6001 PSNR Mean Y:29.15 U:35.74 V:35.30 Avg:30.43 Global:30.34
consecutive B-frames: 9.2% 10.4% 31.6% 48.8%
mb I I16..4: 32.9% 43.0% 24.1%
mb P I16..4: 4.3% 6.9% 1.2% P16..4: 26.3% 8.4% 7.9% 0.0% 0.0% skip:45.1%
mb B I16..4: 0.2% 0.7% 0.1% B16..8: 22.8% 1.4% 1.9% direct: 5.9% skip:67.1% L0:47.9% L1:49.6% BI: 2.5%
8x8 transform intra:55.0% inter:76.3%
direct mvs spatial:100.0% temporal:0.0%
ref P L0 53.9% 15.8% 13.5% 7.7% 9.1%
ref B L0 61.7% 18.4% 13.1% 6.8%
ref B L1 90.8% 9.2%
SSIM Mean Y:0.8745809
PSNR Mean Y:29.449 U:36.018 V:35.715 Avg:30.733 Global:30.596 kb/s:1451.19

encoded 546 frames, 0.52 fps, 1451.45 kb/s

総フレーム数が少ない(秒数にして30秒弱)のでIは5しか割り当てられていない。フェードアウト・フェードインが2回あるので妥当なところか。
Bフレームが最大の3連続している場面が48.8%。もう少し連続数を増やせば全体のQP値はもう少し下げられるか。
参照距離をもっと伸ばせばSSIMの値は上がりそうだが、5フレームしか見てないのにエンコード速度0.52fpsとかだからそれほど弄れなさそう。
(自宅のメイン機ですればもっと速いだろうけど・・・)


試しにbframesを3→4に変更したのがこちら。

slice I:5 Avg QP:36.20 size: 47025 PSNR Mean Y:31.90 U:38.41 V:38.36 Avg:33.17 Global:32.97
slice P:190 Avg QP:37.86 size: 13838 PSNR Mean Y:29.93 U:36.43 V:36.37 Avg:31.22 Global:31.05
slice B:351 Avg QP:39.71 size: 5937 PSNR Mean Y:29.21 U:35.77 V:35.33 Avg:30.49 Global:30.39
consecutive B-frames: 7.4% 8.9% 33.3% 42.1% 8.3%
mb I I16..4: 32.9% 43.0% 24.1%
mb P I16..4: 4.3% 7.1% 1.2% P16..4: 26.7% 8.6% 7.6% 0.0% 0.0% skip:44.4%
mb B I16..4: 0.2% 0.6% 0.1% B16..8: 22.6% 1.4% 1.8% direct: 5.8% skip:67.4% L0:48.2% L1:49.4% BI: 2.4%
8x8 transform intra:55.3% inter:76.4%
direct mvs spatial:100.0% temporal:0.0%
ref P L0 52.8% 16.4% 13.8% 8.1% 8.9%
ref B L0 61.7% 18.7% 13.1% 6.5%
ref B L1 90.2% 9.8%
SSIM Mean Y:0.8753006
PSNR Mean Y:29.487 U:36.027 V:35.723 Avg:30.769 Global:30.627 kb/s:1450.06

encoded 546 frames, 0.50 fps, 1450.32 kb/s

Bフレームの使用数が10ほど増えた分IPBのQP値が下がりSSIMも僅かながら向上している。
しかし、これ以上数値を上げても効果は薄そう。多分refを5からもっと伸ばせば連続使用数も伸びると思うんだけど・・・時間的に厳しいので保留。


次にマトリックスflatからjvtに変えてみる。・・・といってもドット絵なROの映像では画質が悪化しそうだがzzz

slice I:5 Avg QP:36.40 size: 43475 PSNR Mean Y:30.67 U:38.03 V:38.52 Avg:32.05 Global:31.68
slice P:188 Avg QP:38.14 size: 13871 PSNR Mean Y:29.06 U:36.06 V:36.39 Avg:30.41 Global:30.23
slice B:353 Avg QP:40.01 size: 6016 PSNR Mean Y:28.45 U:35.41 V:35.32 Avg:29.78 Global:29.69
consecutive B-frames: 6.8% 9.2% 32.2% 44.4% 7.4%
mb I I16..4: 32.5% 47.2% 20.2%
mb P I16..4: 4.0% 5.9% 0.8% P16..4: 28.1% 9.3% 8.5% 0.0% 0.0% skip:43.4%
mb B I16..4: 0.1% 0.5% 0.1% B16..8: 23.1% 1.3% 2.0% direct: 4.5% skip:68.4% L0:48.3% L1:49.4% BI: 2.3%
8x8 transform intra:54.9% inter:77.0%
direct mvs spatial:100.0% temporal:0.0%
ref P L0 53.5% 16.3% 13.7% 7.7% 8.7%
ref B L0 60.9% 18.9% 13.6% 6.6%
ref B L1 90.4% 9.6%
SSIM Mean Y:0.8683942
PSNR Mean Y:28.680 U:35.653 V:35.719 Avg:30.021 Global:29.884 kb/s:1450.17

encoded 546 frames, 0.52 fps, 1450.42 kb/s

やはり全体的にQP値が上がり、SSIMは下がってしまった。ドット絵とjvtマトリックスとは相性が悪いようだ。


最後にflatに戻してから激重設定(--ref 16 --me "tesa")でどのくらい時間がかかるかを測定。


途中経過:
1pass終了時の処理速度は0.06fps・・・ 現在71%終了で残り時間1時間31分zzz
エンコードに使っているPCの性能が低い(CeleronD 366+915V)とはいえ、高々30秒弱の動画作成に5時間かかるとかありえんな(笑)
じっくりやってるだけあって1pass目のSSIMは0.8866746と良好(ビットレートで70kb/s程オーバーしているせいでもあるが)。
・・・とはいえ、この後ビットレートの調整によってSSIMの値は落ちるだろうから、画質は1割弱の改善。
10倍以上の時間をかけてまでこの設定でエンコードする意味はあるのだろうか? QP=32程度の動画で・・・
(まぁ、今回は実験だから最後までやりますけど)


測定中・・・


エンコード完了!

slice I:4 Avg QP:35.75 size: 46679 PSNR Mean Y:32.43 U:38.83 V:38.82 Avg:33.69 Global:33.50
slice P:200 Avg QP:37.50 size: 13678 PSNR Mean Y:30.25 U:36.49 V:36.46 Avg:31.51 Global:31.33
slice B:342 Avg QP:39.30 size: 5937 PSNR Mean Y:29.58 U:35.92 V:35.53 Avg:30.84 Global:30.72
consecutive B-frames: 9.0% 10.7% 33.8% 39.1% 7.4%
mb I I16..4: 33.8% 42.3% 23.9%
mb P I16..4: 3.9% 5.6% 0.9% P16..4: 28.0% 8.6% 8.7% 0.0% 0.0% skip:44.3%
mb B I16..4: 0.1% 0.4% 0.1% B16..8: 23.5% 1.3% 1.8% direct: 5.5% skip:67.2% L0:54.2% L1:43.7% BI: 2.1%
8x8 transform intra:52.9% inter:76.1%
direct mvs spatial:100.0% temporal:0.0%
ref P L0 44.6% 11.8% 9.5% 4.6% 4.2% 3.9% 3.9% 2.1% 1.9% 1.9% 1.8% 1.7% 1.6% 2.0% 2.3% 2.3%
ref B L0 47.1% 12.1% 7.9% 4.3% 4.2% 3.7% 3.6% 2.9% 2.3% 2.1% 2.2% 2.2% 1.9% 1.8% 1.7%
ref B L1 91.1% 8.9%
SSIM Mean Y:0.8828935
PSNR Mean Y:29.846 U:36.149 V:35.897 Avg:31.105 Global:30.950 kb/s:1451.40

encoded 546 frames, 0.06 fps, 1451.65 kb/s

SSIMの値は下がって、結局画質の改善は6.4%程度に収まる。この数値はおそらく1.45Mb/sにおけるこの素材での限界値付近。
(後影響がありそうな設定はビットレートのI-P・P-Bのフレーム間係数とかだろうけど、これを触ってSSIMに良い影響を与えるかどうか・・・<多分悪くなるか大して変わらない)
出来上がった映像を見比べてみると・・・情報量が足りな過ぎて石畳の模様が変わってしまっていたりしてますねzzz
やっぱり1024×768×65535色×25fpsを1.45Mb/sに収めようというのが無理なのだろうか(TT)


追記:
自宅のメイン機で最後の設定を試してみる。

slice I:7 Avg QP:35.57 size: 34811 PSNR Mean Y:42.48 U:48.08 V:48.06 Avg:43.57 Global:34.29
slice P:212 Avg QP:37.89 size: 13090 PSNR Mean Y:29.91 U:36.37 V:36.34 Avg:31.19 Global:31.05
slice B:327 Avg QP:39.50 size: 5931 PSNR Mean Y:29.30 U:35.77 V:35.39 Avg:30.57 Global:30.49
consecutive B-frames: 11.7% 12.6% 32.3% 37.8% 5.6%
mb I I16..4: 45.8% 36.6% 17.6%
mb P I16..4: 4.1% 5.6% 1.0% P16..4: 28.3% 8.3% 8.8% 0.0% 0.0% skip:44.0%
mb B I16..4: 0.1% 0.5% 0.1% B16..8: 23.8% 1.3% 1.8% direct: 5.5% skip:67.0% L0:53.8% L1:44.3% BI: 1.9%
8x8 transform intra:49.9% inter:76.2%
direct mvs spatial:100.0% temporal:0.0%
ref P L0 45.5% 12.0% 9.4% 4.3% 3.9% 3.7% 3.6% 2.1% 1.8% 1.8% 1.7% 1.7% 1.9% 1.7% 2.7% 2.3%
ref B L0 47.6% 12.2% 7.7% 4.4% 4.2% 3.8% 3.4% 2.9% 2.3% 2.1% 2.2% 2.2% 1.8% 1.7% 1.6%
ref B L1 91.2% 8.8%
SSIM Mean Y:0.8792499
PSNR Mean Y:29.705 U:36.161 V:35.924 Avg:30.978 Global:30.736 kb/s:1452.91

encoded 546 frames, 0.37 fps, 1453.19 kb/s

完全に同じ設定なのに、全く違う結果が出ましたね。シングルスレッドとマルチスレッドの差があらわれたのでしょうか?
速度的には6倍以上早く終わってはいるんですけど、それでも所要時間は1時間弱。この設定で2時間の動画をエンコードしたら・・・138時間かかるわけですね・・・
って、エンコードで1週間終わるじゃないか(笑)