x264 bframes (Bフレームの最大連絡可能数) の最適値考察

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

はじめに

検証対象

オプション概要標準値最小値最大値
–bframes動画出力の品質レベルを指定する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 --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

コメント

  1. […] x264 bframes (Bフレームの最大連絡可能数) の最適値考察x264 bframes (Bフレームの最大連絡可能数) の最適値について、実験から適正値を考察してみました。ram64gb.com2021.01.17 […]

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