12月 25

x264を用いてH.264にエンコードする場合、どの程度のビットレートや画質設定でエンコードするのが適切なのか、という問題がある。

x264でのエンコードには、昔ながらのビットレート指定タイプと、今主流の品質指定タイプの2種類があるが、アニメのように実質的に静止画が多い場合には、この品質指定タイプが非常に有効であり、画質をほとんど落とすことなく、ファイルサイズを大きく下げることが可能になる。

この場合、品質(画質)はcrfというパラメータによって与えるのだが、これをどれくらいの値にしたら良いのか、というのが難しい。

crf値は値が小さければ小さいほど画質がよくなるが、その分ファイルサイズは大きくなり、大きな値にすればするほどファイルサイズは小さくなるが、その分画質が落ちる。

というわけで、以前、SD動画の頃に、実際に様々なcrf値で動画圧縮をして、その結果を見比べた結果、crf 18~19くらいまで品質をあげてやると、ほぼエンコード後の画質の劣化が分からない、という結論になった。

だが、SD解像度の場合、17や16にしてみてもそれほどファイルサイズが変わらなかったので、今まではcrf 16でエンコードしていたのだが、最近はFull HD解像度のものが多くなり、crf 16と18ではかなりファイルサイズが違ってくるため、改めてFull HD解像度向けに検討しなおしてみることにした。

画質の客観的な品質基準として、x264にはSSIMという測定基準が設けられている。

このSSIMというのは、簡単に言うとエンコード前とエンコード後の画質の差をあらわすものであり、全く同一の場合1.0、0.98以上の数値であれば見分けがつかず、0.97になると、画質劣化が明らかに分かるようになる、と言われている。

そんなわけで、実際にcrfを変えて、SSIMやその他色々と測定してみた結果が以下のとおりである。

ssim.png

SSIM測定結果

実験用動画ファイルはストライクウィッチーズ2のオープニング90秒の動画ファイルを用いた。

crf 16では0.99に近い値が出ており、crf 18で0.987,  crf 19で0.986, そしてcrf 20で0.985と、なかなか良い数値が出ている。

crf 22で0.982, crf 24だと0.9797と、遂に0.98を割り、crf 30では0.966と、0.97すら下回ってしまい、一般的基準からは、crf 22あたりが高画質と呼べる限界ということになる。

実際に各crf値での画質をキャプチャしてみたものを以下に示す。

q16.png
CRF16

q18.png
CRF 18

q19.png
CRF 19

q20.png
CRF 20

q22.png
CRF 22

q24.png
CRF 24

q26.png
CRF 26

q30.png
CRF 30

これらエンコードした動画を見比べてみると、16~20まではほぼ劣化が分からないが、crf 22から微妙に劣化が分かり始める。26になると明らかに劣化してきて、30では完全に劣化しまくっている。

このように静止画にするとそれほど気にならないのだが、実際に動画で見ると、22からはモスキートノイズが多少見え始める感じである。

さらに16~20では、16と18は動画で見比べても全く見分けは付かず、20でも、フェードインの場面で僅かにモスキートノイズがあるかな~程度で、ほとんどの場面では見分けがつかない。

そんなことから、ssim値としては、人間の目で見比べて分からないくらいになるのは、実際には0.985以上といったところであり、0.982だと劣化してるのが分かる。

それ以下はcrf 21~22辺りまでがそこそこ高画質と呼べる限界で、24になると劣化が気になり始める。

というわけで、画質の劣化がほとんど分からず、さらにファイルサイズもそれなりに小さくなり、エンコード時間もまぁまぁ速い、というところから、crf 18~20辺りがアニメーション動画のエンコードにとって適切な値ではないか、と思われる。

4 Responses to “x264のcrf値はどれくらいが適切なのか?”

  1. 匿名 Says:

    crfの設定で検索して来ました。
    確かに22前後を境に輪郭部分でノイズが目立ってきますね。

    参考に教えて欲しいのですが、動画の解像度は720Pですか?それも1080Pでしょうか?

  2. moni Says:

    1080iです。

  3. 1 Says:

    レスありがとうございます

  4. 匿名 Says:

    にゃるほど!
    参考になりました。ありがとう

Leave a Reply