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測定結果
実験用動画ファイルはストライクウィッチーズ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値での画質をキャプチャしてみたものを以下に示す。
これらエンコードした動画を見比べてみると、16~20まではほぼ劣化が分からないが、crf 22から微妙に劣化が分かり始める。26になると明らかに劣化してきて、30では完全に劣化しまくっている。
このように静止画にするとそれほど気にならないのだが、実際に動画で見ると、22からはモスキートノイズが多少見え始める感じである。
さらに16~20では、16と18は動画で見比べても全く見分けは付かず、20でも、フェードインの場面で僅かにモスキートノイズがあるかな~程度で、ほとんどの場面では見分けがつかない。
そんなことから、ssim値としては、人間の目で見比べて分からないくらいになるのは、実際には0.985以上といったところであり、0.982だと劣化してるのが分かる。
それ以下はcrf 21~22辺りまでがそこそこ高画質と呼べる限界で、24になると劣化が気になり始める。
というわけで、画質の劣化がほとんど分からず、さらにファイルサイズもそれなりに小さくなり、エンコード時間もまぁまぁ速い、というところから、crf 18~20辺りがアニメーション動画のエンコードにとって適切な値ではないか、と思われる。
crfの設定で検索して来ました。
確かに22前後を境に輪郭部分でノイズが目立ってきますね。
参考に教えて欲しいのですが、動画の解像度は720Pですか?それも1080Pでしょうか?
1080iです。
レスありがとうございます
にゃるほど!
参考になりました。ありがとう