Pフレーム
Predicted frame / ピーフレーム
前のフレームを参照して、そこからの変化ぶんだけを記録する圧縮フレームのことです。動画のデータ量を抑える主役で、単独では絵にならず、前のフレームが揃って初めて復元できます。
- 意味
- 表示順で前にあるフレームを参照し、差分だけを符号化したフレーム
- 別の呼び方
- Pピクチャ、順方向予測フレーム
- データ量
- Iフレームより小さく、Bフレームよりは大きいことが多い
- 参照するもの
- MPEG-2は直前の1枚、H.264やHEVCは前に復号した複数のフレームから選べる
- 仕組み
- ブロックごとに動きベクトルで参照先を指し、ずれのぶんだけを残差として記録する
- 変化がないとき
- スキップとして記録され、ほぼデータを使わない
- 確認方法
- ffprobeで `pict_type` を出すと P と表示される
動画のファイルサイズが写真の連番よりはるかに小さく収まるのは、ほとんどのフレームを前のフレームからの変化として記録しているからです。その役目を担うのがPフレームで、圧縮された動画の中では最も数の多いフレームになります。
Pフレームが使われる場面
配信でも収録でも、Long GOPと呼ばれる方式のファイルは中身の大半がPフレームです。XDCAM HD422やAVC-LongG、H.264やHEVCで書き出したMP4は、先頭のIフレームのあとにPフレームが続き、その間にBフレームが挟まる形で並びます。
遅延を切り詰めたいライブ配信では、Bフレームを使わずIフレームとPフレームだけで組む設定がよく選ばれます。Pフレームは表示する順番と符号化する順番が同じなので、並べ替えのための待ち時間が発生しません。エンコーダの設定でBフレームを0にすると、この構成になります。
監視カメラや画面共有のように、画面のほとんどが動かない映像でもPフレームが効きます。変わっていないブロックはスキップとして扱われ、ほぼデータを使わずに済むためです。
Pフレームの仕組み
Pフレームは、画面を小さなブロックに分け、ブロックごとに「前のフレームのどこから持ってきたか」を動きベクトルで指します。カメラが横に振れただけの場面なら、多くのブロックが同じ方向のベクトルで済み、絵そのものを書き直さずに表現できます。指した先と実際の絵とのずれだけを残差として記録し、そこにも圧縮がかかります。
参照できる範囲はコーデックで違います。MPEG-2のPフレームは直前のIフレームかPフレームの1枚だけを見ますが、H.264以降は復号済みの複数のフレームを候補にでき、被写体が一度隠れて再び現れるような場面でも前の絵を使い回せます。この枚数はエンコーダの参照フレーム数の設定で決まります。
Pフレームは参照の連鎖でつながっているため、途中の1枚が壊れると、次のIフレームが来るまで乱れが残ります。伝送でエラーが出たときに絵が尾を引くのは、この連鎖が理由です。
Pフレームの設定で間違えやすい点
Pフレームだけを直接指定する設定項目は、多くのエンコーダにはありません。実際に触るのはキーフレーム間隔とBフレームの枚数で、その残りがPフレームになります。「Pフレームを増やしたい」と考えているときは、キーフレーム間隔を長くする操作を指していることがほとんどです。
編集での扱いにも注意が必要です。Pフレームの位置でカットすると、NLEは前のIフレームまでさかのぼって復元してから切り出すため、素材によっては動作が重くなります。編集を前提にした素材では、オールイントラのコーデックへ変換するか、プロキシを作って進めるのが一般的です。
よくある質問
PフレームとBフレームはどちらが小さいですか
一般には、前後の両方を参照できるBフレームのほうが小さくなります。ただし場面によっては差が小さく、動きが単純な映像ではPフレームでも十分に縮みます。
Pフレームだけで動画を作れますか
先頭に1枚のIフレームがあれば、あとはすべてPフレームという構成も作れます。低遅延の配信ではこの形が使われますが、途中から再生を始められる位置が先頭だけになるため、配信では定期的にIフレームを入れます。
Pフレームの数を確認する方法はありますか
ffprobeでフレームの種類を出力し、Pの数を数えるのが手軽です。MediaInfoでは種類ごとの内訳までは出ないため、フレーム単位で見るならffprobeを使ってください。
似ている形式との違い
関連する用語
最終更新