Bフレームとは、前後のフレームの両方を利用して画像を再構成できる動画フレームのことです。B は「bidirectional(二方向)」を意味します。Bフレームは他のフレーム形式よりも多くの圧縮率を実現できるため、動画サイズを小さく保つのに役立ちます。
動画ファイルのメタデータには、Has B Frames や has_b_frames という項目が表示されることがあります。名前からは「はい・いいえ」で答える項目のように見えますが、実際の値は数値です。この数値は、動画を正しい順序で表示するために、デコーダーがメモリ内に保持しておく必要があるフレーム数を表します。
bフレーム とは:IフレームやPフレームとの違い
動画の圧縮は一般的に、フレーム同士を比較し、その差分のみを記録することで行われます。MPEG-2 動画では、次の3種類のフレームが定義されています。
- Iフレーム: 他のフレームを参照せずに符号化されるため、このフレームからデコードを開始できます
- Pフレーム: 直前の Iフレームまたは Pフレームを参照できます
- Bフレーム: 前後の Iフレームまたは Pフレームの両方を参照できます
Bフレームは、時間的に後に現れるフレームに依存する場合があります。そのため、その後のフレームを先に保存しておく必要があります。保存される順序は、画面に表示される順序と異なります。代表的な MPEG-2 のフレーム列は次のようになります。
- 表示順序:
B1 B2 I3 B4 B5 P6 B7 B8 P9 B10 B11 P12 - 保存順序:
I3 B1 B2 P6 B4 B5 P9 B7 B8 P12 B10 B11
値の見え方
Has B Frames の値は整数です。FFmpeg では、この値をデコーダー内のフレーム並べ替えバッファの大きさとして説明しています。MPEG-2 動画では、FFmpeg は次の2つの値を定義しています。
0: Iフレームと Pフレームのみを使用する低遅延動画1: Iフレーム、Pフレーム、および Bフレームを使用する動画
H.264 や HEVC のエンコーダーでは、一部の Bフレームを他のフレームの参照用として保持することもできます。FFmpeg の H.264 用テストファイルは、この設定によって値がどのように変化するかを示しています。ファイル名にはエンコーダー設定が反映されています。
- 連続する Bフレームを最大3枚とし、参照用に保持しない場合:
1 - 連続する Bフレームを最大3枚とし、一部を参照用に保持する場合:
2 - 連続する Bフレームを最大4枚とし、一部を参照用に保持する場合:
2
したがって、この値は Bフレームの枚数そのものではありません。ffprobe プログラムは、各フレームの種類を pict_type 値として I、P、B のいずれかで表示します。NB Frames 項目はフレームの総数を示しますが、種類は示しません。
値の由来
この項目名は FFmpeg に由来し、ffprobe プログラムが動画ストリームに対して has_b_frames として出力します。H.264 ストリームでは、この値をヘッダー内に記載できる場合があります。ヘッダーに値が記載されていない場合、FFmpeg はフレームとそのタイミングから値を算出します。
動画が Bフレームを使用するかどうかは、エンコーダーの設定によって決まります。FFmpeg や Microsoft H.264 エンコーダーでは、0 を指定すると Bフレームが無効になります。
どのファイルがそれを持っているか
この項目は動画ストリーム専用です。MP4、MOV、MKV、WebM、AVI ファイルの動画ストリームでこの項目を確認できます。フレームの順序が並べ替えられている MOV ファイルには、各フレームのデコードと表示の時間差を記録したテーブルも保存されます。
Bフレームを使用できるかどうかはコーデックによって決まります。MPEG-2 動画や H.264 Main プロファイルでは Bフレームを使用できますが、H.264 Baseline プロファイルでは使用できません。WebM ファイルで使われる VP8 コーデックには Bフレームがありません。VP8 では、フレームが後続フレームから予測されることがないためです。
それが重要な理由
Bフレームは動画サイズの削減に役立ちますが、その分遅延が増えます。エンコーダーはフレームを保存する前に並べ替える必要があり、この遅延は連続する Bフレームの数に依存します。
フレームが並べ替えられた動画では、各フレームには「デコードするタイミング」と「表示するタイミング」という2種類の時間情報があります。FFmpeg は、これらをストリームのタイムベースに基づくタイムスタンプとして出力します。