x264 crf (動画出力の品質レベル) の最適値考察

ソフトウェア
スポンサーリンク

はじめに

検証対象

オプション概要標準値最小値最大値
crf動画出力の品質レベルを指定する23-1221

補足事項

このページでは、x264 エンコードオプションの1つである「上記のエンコードオプションの数値を変動させると、エンコードに結果にどう影響するのか」の検証に特化してしています。

本オプションの概要やしくみについては、弊ブログ内の「x264 CLI オプション解説」、つまり下記のページを参照ください。また、当該オプション以外をご覧になられたい方も、同様に下記をご確認ください。

テスト条件

PCスペック、テスト素材

スペック名称
CPUAMD Ryzen5 3600
GPURadeon RX 570
メモリDDR4 32GB
ChipsetAMD B550
テスト素材
素材タイプアニメーション (灼眼のシャナ OP1)
時間00:01:30
解像度1920 x 1080
フレームレートYUV420 (YV12)
総フレーム数23.976024fps (24000/1001fps)
総フレーム数2159フレーム

設定

x264.exe --preset medium --crf [15~30] --ssim -o "%InFile%.avs.264" "%InFile%.avs"

※テストは本来数回行った平均とすべきですが、今回は各数値1回づつで測定しています。

※Avisynth スクリプトはじめ、更に詳しい設定については「参考」の欄を確認ください。

テスト結果

crf は指定する数字が「小さくなるほどに高画質」となることに注意してください。

エンコード速度 [fps]

グラフをみると、設定した数字と比例するような相関性のある結果となっております。

要求品質レベルに応じて、エンコード速度は低下しております。曲線を描く訳ではなく、きれいな曲線になっていることが読み取れます。

ビットレート [kb/s]

グラフをみると、設定した数字と相関性のある結果となっております。きれいな曲線ですね。

また x264 のデフォルト値である 22 あたりを境に、数字が小さくなるに従って角度が急激に変動していることがわかります。特に 22 以下はビットレート(ファイルサイズ)への影響が多きそうですので、設定には注意が必要かもしれません。

グラフから確認すると、x264 のデフォルト値である 22 を中心として、crf 30と 15 では、ファイルサイズに訳4倍の影響が発生しています。

画質 [SSIM Meen Y]

グラフを見やすくする都合上、グラフ縦項目の値を省略して表示している事に注意してください。

グラフをみると、設定した数字と相関性のある結果となっております。きれいな曲線ですね。

当然ではありますが、要求品質レベル増大(ビットレート増大)にしたがって、画像の綺麗さ(画像の機械的評価)は良好になっています。

まとめ

実験前までは「 crf を上げようとも円エンコード速度は変わらない」 と思い込んでいましたが、どうやらそうではなく、ビットレートの増大に従ってエンコード時間が大幅に増大することがわかりました。

とはいえ、ビットレート配分は動画の画質に「一番影響する」項目でありますので、ここはエンコード時間は気にせず、自分の必要とする画質でしっかり設定するべきです。

設定は迷いますが、まずは初期値である22を基準に考え、20-22 あたりで設定を試してみるのがよいと思われます。23より数字が大きいと画質低下(ブロックノイズ、モスキートノイズ、等々)が目立ってくると思います。

これは私見ですが、最近は HDD や SSD も大容量化が進んでいますので、少しくらい設定を盛ってもいいのいではないでしょうか。落ちた画質はどうやっても元には戻せませんが、後から画質を落とす事は可能ですし。

所感

ビットレートの増大に従ってエンコード時間が大幅に増大することがわかりましたが、個人的には、この結果にはかなり驚きました。やはり自分で実験してみないと分からない事って、あるもんですね! これからも実験をしていきたいと思います!

※もし今回のテストで使用した「使用バッチファイル」「エンコードログ」を確認したい方がおられましたら、次のページを参考ください。

参考

使用バッチファイル

REM [video] > [H.264+AAC].mp4
REM You should set FPS.
REM FPS example => 23.976024, 24, 25, 29.970030, 30

@ECHO OFF
SET FPS=
SET /P FPS="Please enter FPS => "
@ECHO ON

SET InFile=%~dpnx1
SET OutFile=%~dpn1.mp4

@ECHO OFF

ECHO FFIndex("%InFile%") > "%InFile%.avs"
ECHO AudioDubEX(FFVideoSource("%InFile%"),FFAudioSource("%InFile%")) >> "%InFile%.avs"
ECHO ConvertToYV12() >> "%InFile%.avs"
ECHO return last >> "%InFile%.avs"

@ECHO ON
x264.exe --preset medium --crf 15 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --crf 16 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --crf 17 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --crf 18 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --crf 19 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --crf 20 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --crf 21 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --crf 22 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --crf 23 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --crf 24 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --crf 25 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --crf 26 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --crf 27 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --crf 28 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --crf 29 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --crf 30 --ssim -o "%InFile%.avs.264" "%InFile%.avs"




PAUSE

コメント

タイトルとURLをコピーしました