はじめに
検証対象
オプション | 概要 | 標準値 | 最小値 | 最大値 |
---|---|---|---|---|
–bframes | 動画出力の品質レベルを指定する | 3 | – | – |
補足事項
このページでは、x264 エンコードオプションの1つである「上記のエンコードオプションの数値を変動させると、エンコードに結果にどう影響するのか」の検証に特化してしています。
本オプションの概要やしくみについては、弊ブログ内の「x264 CLI オプション解説」、つまり下記のページを参照ください。また、当該オプション以外をご覧になられたい方も、同様に下記をご確認ください。
テスト条件
PCスペック、テスト素材
スペック | 名称 |
---|---|
CPU | AMD Ryzen5 3600 |
GPU | Radeon RX 570 |
メモリ | DDR4 32GB |
Chipset | AMD B550 |
テスト素材 | |
---|---|
素材タイプ | アニメーション (灼眼のシャナ OP1) |
時間 | 00:01:30 |
解像度 | 1920 x 1080 |
フレームレート | YUV420 (YV12) |
総フレーム数 | 23.976024fps (24000/1001fps) |
総フレーム数 | 2159フレーム |
設定
x264.exe --preset medium --bframes [1~16] --ssim -o "%InFile%.avs.264" "%InFile%.avs"
※テストは本来数回行った平均とすべきですが、今回は各数値1回づつで測定しています。
※Avisynth スクリプトはじめ、更に詳しい設定については「参考」の欄を確認ください。
テスト結果
エンコード速度 [fps]
エンコード時間は、Bフレームの増加に伴って増大することがみてとれます。
- 1~4枚あたり:急激に増大
- 5~9枚あたり:緩やかに増大
- 10~16枚あたり:横ばいか、極僅かに増大
していることが読み取れます。
しかしながら、この演算負荷の変化量はx264のエンコードの重要オプション(ref:参照フレーム数指定. crf:出力画質指定)あたりと比較すると、非常に少ないものです。最小の1枚と16枚を比較しても、その差は約10%程度です。
(画質への影響はあとで検証しますが)演算負荷だけをみると、演算負荷はあまり気にせず、自分の満足できる数値で指定するのがよいのではないかと。
ビットレート [kb/s]
グラフを見やすくする都合上、グラフ縦項目の値を省略して表示している事に注意してください。
ビットレートはBフレームの増加に伴って低減されている(圧縮率が向上している)ことがよみとれます。
- 1~4枚あたり:急激に圧縮率向上
- 5~9枚あたり:極僅かに圧縮率向上
- 10~16枚あたり:横ばいか、極僅かに低下
していることが読み取れます。
低下している部分については謎で、本当に低下するのか、誤差なのかは分かりません。しかしながら、過剰に数字を増やしても「圧縮率向上には結びつかない」ということは言えると思われます。
画質 [SSIM Meen Y]
グラフを見やすくする都合上、グラフ縦項目の値を省略して表示している事に注意してください。
SSIM (機械的な画質比較の指数)はBフレームの増加に伴って低下していることが読み取れます。x264はデフォルトでは 「crf(固定品質モード)」でエンコードされることから、どのような設定でも本来画質は一定(その代わりファイルサイズに影響が出る)のはずですが、僅かな影響はあるようです。
こは私見ですが、BフレームはIフレームと比較して「画像単体の画質は劣るが、コスパ(ビットレート配分の効率が良い)」という特徴が影響しているのではないかと思われます。つまり、Bフレームの比率が増えたことによって、SSIM に影響が出ているというわけです。
とは言え、1枚のときと16枚のときで比較しても影響は0.1程度ですので、まり気にしなくてようでしょう。それよりも「僅かな画質低下のみで、圧縮率が大きく上がっている」ということ重要視すべきです。
まとめ
上記のテスト結果からすると、
- 変換速度重視:4枚あたり
- バランス重視:5~6枚あたり
- 画質重視 :8~10枚あたり
が妥当な線かと思われます。
10枚以上に設定しても圧縮率は殆ど改善されない上に、演算負荷が上がってエンコード時間はしっかり長くなっています。意味がないとは言えないまでも、エンコード時間と圧縮率への影響のバランスが悪く、明らかに割に合いません。
またBフレーム数が増えるにしたがって、エンコード負荷だけでなく動画再生時のデコード負荷も上がりますので、無駄に大きな数量は避けるべきと考えます。
所感
Bフレーム設定はエンコード時に迷う項目のですが、今回のテストである程度明確になりました!
今後の参考にしたいと思います!
※もし今回のテストで使用した「使用バッチファイル」「エンコードログ」を確認したい方がおられましたら、次のページを参考ください。
参考
使用バッチファイル
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 --bframes 1 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --bframes 2 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --bframes 3 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --bframes 4 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --bframes 5 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --bframes 6 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --bframes 7 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --bframes 8 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --bframes 9 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --bframes 10 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --bframes 11 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --bframes 12 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --bframes 13 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --bframes 14 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --bframes 15 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
x264.exe --preset medium --bframes 16 --ssim -o "%InFile%.avs.264" "%InFile%.avs"
PAUSE
コメント
[…] x264 bframes (Bフレームの最大連絡可能数) の最適値考察x264 bframes (Bフレームの最大連絡可能数) の最適値について、実験から適正値を考察してみました。ram64gb.com2021.01.17 […]