x264 ref (参照フレーム) の最適値考察

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

はじめに

検証対象

オプション概要標準値最小値最大値
ref参照フレーム数を指定する3

補足事項

このページでは、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 --ref [1~16] --ssim -o "%InFile%.avs.264" "%InFile%.avs"

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

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

テスト結果

エンコード速度 [fps]

基本的には設定した数字と比例するように、相関性のある結果となっております。

1~3枚までは大きく影響していて、その後の影響は徐々に緩やかになっている傾向です。また、x264 のデフォルト値である 3枚 から 16枚に増やしたとき、エンコード速度が約 50% に低下しています

なお、参照フレーム数 3~4 の部分で綺麗な線になっていないのは、恐らくですが、前テストを行った際のデータがキャッシュとして残っていたりしたためではないかと思われます。

ビットレート [kb/s]

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

また x264 のデフォルト値である3枚以下に設定すると、圧縮効率が著しく低下している事が分かります。このことから、3枚以下の設定はなるべく避けるべきであると考えます。

それ以降、9枚 辺りまでは比較的大きな角度(大きな効果)になっていますが、10 枚を超えたあたりからは効果は限定的になっています。

x264 のデフォルト値である参照フレーム数 3枚 から 16枚に増やしたとき、ビットレート(ファイル容量)が 98.7% に削減されています。

画質 [SSIM Meen Y]

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

x264 は標準では 固定品質1パスエンコード (crf )が使用される事から、オプションを変えても本来は画質は低下しないはずです。ですが念のため、実績を検証してみることにしました。

結果としては意外な事に、このテストをみる限りでは、参照フレーム数の増加に伴って画質(SSIM)が若干向上している事が分かります。とはいえ、向上しているといっても、デフォルト値の 3枚 と 16枚の比較で 0.010% しか変わらないので、殆ど気にする必要は無い程度であると思われます。

まとめ

3つのグラフをみたとき、参照フレーム 3枚 を境にエンコード結果が大きく違ってきている事が読み取れます。なお x264 のデフォルト値は 3枚 に設定されているのですが、これはバランスの取れた理にかなった数値であるように思われます。

設定は迷うのですが 3 ~ 9 枚あたりまでがエンコード時間/圧縮効果からみて適正値ではないでしょうか。

もし個人的にエンコードする場合は 8~10 枚くらいを使いたいですね。x264 が登場した当時からみて最近のパソコンは高性能化してますし、ある程度、負荷の高い(画質重視の)設定でも良い気がしています。

所感

エンコード速度のグラフが綺麗な線にならなかった理由は恐らくキャッシュの所為だと思われるのですが、いつかもう一度テストした方がいいかもしれないですねー。もしくはN数を増やすか。

参照フレーム数を多くしても、意外と効果が限定的だったのは少し以外でしたが、こんなものなのかもしれないですね。

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

参考

使用バッチファイル

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 --ref 1 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --ref 2 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --ref 3 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --ref 4 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --ref 5 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --ref 6 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --ref 7 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --ref 8 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --ref 9 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --ref 10 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --ref 11 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --ref 12 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --ref 13 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --ref 14 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --ref 15 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --ref 16 --ssim -o "%InFile%.avs.264" "%InFile%.avs"




PAUSE

コメント

  1. […] x264 ref (参照フレーム) の最適値考察x264のref (参照フレーム) について、実験から適正値を考察してみました。ram64gb.com2020.09.06 […]

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