キーフレームとは?Iフレーム・Pフレーム・Bフレームの違い【GOP】

動画のおける「キーフレーム」の意味について紹介します。

スポンサーリンク

動画の仕組み

30fpsイメージ

キーフレームについて説明する前に、「動画の仕組み」について簡単に説明します。

動画の仕組みは、ザックリ言うと「パラパラ漫画」です。

1枚1枚の画像(フレームと呼ぶ)を高速でめくっていく事で、動いてる風に見せかけているだけなのです。

ただ、この時、フレームをそのまま「動画」に落とし込んでしまうと、3分で15GBなどという巨大なサイズの動画になってしまいます。

なので通常、私たちが普段視聴している動画では「コーデック」と呼ばれる「圧縮のアルゴリズム」を使用して、動画を色々な方法で圧縮しています。

参考動画形式とは?コーデックとの違い【コンテナ、フォーマット】

圧縮方法

「コーデック」を使って動画を圧縮する方法としては、

主に以下の2種類に分類できます。

1.フレーム間で似たような部分を圧縮する方法(フレーム間予測)

例えば、ニュース番組などでキャスターが淡々とニュースを読み上げているシーンがあるとします。

このシーンでは、実際に動いているのは「口元」部分くらいで、その他の背景はほとんど変化しません。

そのような「フレーム間にある無駄な情報」を圧縮する方法を「フレーム間予測」と言います。

2.フレーム内の情報を圧縮する方法(フレーム内圧縮)

例えば、全面に空が広がるようなシーンがあるとします。

このシーンでは、ほとんどの色情報が「青」に似たような色となります。

BBBAAAAAAA
AAAAAABBCC
AABBBCCCCC

※データ量=30
※すべてピクセルだと仮定してください

 

このようなシーンの場合、

3B7A
6A2B2C
2A3B5C

※データ量=16
※すべてピクセルだと仮定してください

という風に

「同じ色は掛け算で表そう!」(ランレングス圧縮と言う)という風にファイルを圧縮したり、

10A
8A2C
5A5C

※データ量=11
※すべてピクセルだと仮定してください

という風に

「AとBなんてほとんど一緒の色なんだし全部Aにしちゃえ!」という風にファイルを圧縮します。

このように、「1つのフレーム内でムダなところを圧縮しよう!」という圧縮方法のことを「フレーム内圧縮」と言います。

フレーム間予測>>>>フレーム内圧縮

圧縮効果としては「フレーム間予測>>>>フレーム内圧縮」となり、

「フレーム間予測」に比べると「フレーム内圧縮」で圧縮できるサイズは微々たるモノとなります。

キーフレームとは?

というわけで前置きが長くなりましたが、

「フレーム間予測」で行われる圧縮は、すごく重要なわけです。

 

で、

「フレーム間予測」では、1枚1枚のフレームを、

  • Iフレーム(=キーフレームのこと)
    • そのフレーム全ての情報を保持したフレーム
      (1フレームだけで完結できるフレーム)
  • Pフレーム
    • 前の「Iフレーム」を参照しないと差分しか表現できないフレーム
  • Bフレーム
    • 前後の「Iフレーム」「Pフレーム」「Bフレーム」を参照しないと差分しか表現できないフレーム

の3つに分ける事でフレーム間の圧縮をします。

要するに、「フレームに全ての情報を詰め込んでしまうと容量が勿体ないから、他フレームで補える部分は補ってしまおう」という事です。

 

そして、

ここで言う「Iフレーム」のことを、通称「キーフレーム」と呼びます。

 

Iフレーム」が「Pフレーム」や「Bフレーム」のキーとなるフレーム。

なのでキーフレームということです。

ちなみに、このように各フレームを

  • Iフレーム
  • Pフレーム
  • Bフレーム

の3つに分けて分けて圧縮する技術の事を「GOP(Group of Picture)」といいます。MPEG系のコーデックの仕組みは全てコレです。(H.264・MPEG-4・MPEG-2・MPEG-1など)

動画を「GOP」単位でカットする事で「再圧縮なし」で無劣化編集できます。

参考【AviUtl】動画を再圧縮なしで編集・出力する方法【無劣化】

図で表すと?

例えば、以下の様な感じで

  • 1フレーム目
  • 2フレーム目
  • 3フレーム目

と「飛行機」だけが右に移動する動く動画があったとします。

キーフレームキーフレーム1キーフレーム2
▲1フレーム目
Iフレーム
▲2フレーム目
Iフレーム
▲3フレーム目
Iフレーム

この場合、

これらのフレームは全て「Iフレーム」となります。

なぜなら、全てのフレームがすべての情報を有しているからです。

 

そして、これらの「2フレーム目」「3フレーム目」を

  • Pフレーム
  • Bフレーム

に置き換えるとすると、以下のようになります。

キーフレームb,pフレーム2b,pフレーム1
▲1フレーム目
Iフレーム
▲2フレーム目
Bフレーム or Pフレーム
▲2フレーム目
Bフレーム or Pフレーム

この場合、「2フレーム目」「3フレーム目」では、「飛行機」のデータだけを保持すれば良いので、「Bフレーム」もしくは「Pフレーム」になります。

 

「2フレーム目」「3フレーム目」は、1フレーム目の「Iフレーム」の情報を元にデコード(再生)するだけで良いので、データサイズは非常に小さくできるというわけです。

もっと言えば、3フレーム目は、2フレームの「飛行機」を右にスライドさせただけなので、3フレーム目が保持している情報は「2フレーム目の飛行機を○○pxだけずらす」という情報だけで済みます。

このように「前フレームから後フレームの動きを予測してファイルサイズを圧縮する」ことを「動き予測(動き補填)」といいます。

「動き予測(動き補填)」には色々なアルゴリズムがあって、圧縮する上で重要な項目となります。(h.264などのコーデックの圧縮率が良いのは、この辺の技術が優れているからです)

エンコード時のGOPの留意点

動画編集でエンコードする際に注意る点としては、

以下の様な感じです。

  • 「Iフレーム」 が多いほど・・・
    →動画のシーク(早送り・巻き戻し)がサクサクできる(ただしファイルサイズが大きくなる )
  • 「Pフレーム」 が多いほど・・・
    →ファイルサイズは小さくなる(その分シークが遅くなる)
  • 「Bフレーム」が多いほど・・・
    →ファイルサイズはすごく小さくなる(その分シークは激遅になる)

h.264コーデックだと「Iフレーム」の間隔は大体「60フレーム」くらいが普通です。

MPEG-2だと「Iフレーム」の間隔は大体「20フレーム」くらいです。

ほとんどシーンチェンジがない動画では「Bフレーム」が多くなります。

シーンチェンジが多い動画だと「Pフレーム」(もしくは「Iフレーム」 )が多くなります。

エンコーダーでのキーフレーム間隔の設定

AviUtlの出力プラグインである、

などを例に、キーフレーム間隔の設定のやり方について紹介します。

x264guiEx

x264guiExでは、

「フレーム」タブ→「GOP関連設定」というグループの中の項目にて設定できます。

x264guiex_gop_キーフレーム
  • シーンカット閾値
    •  Iフレームの入りやすさを示します。
    • 大きくすればちょっとしたシーンチェンジでもすぐに挿入されます。(=ファイルサイズが大きくなる)
    • 小さくすればするほどIフレームが挿入されにくくなります。(=ファイルサイズが小さくなる)
  • キーフレーム間隔の上限
    •  Iフレームの挿入する最大の間隔を指定できます。
    • 例えば「4」と指定すると、「シーンカット閾値」の値に関係なく、4フレーム毎以上には挿入されません。(3フレーム毎などには挿入されないという事)
  • キーフレーム間隔の下限
    • Iフレームの挿入する最低の間隔を指定できます。
    • 例えば「60」と指定すると、「シーンカット閾値」の値に関係なく、最低限「60」フレーム毎以内にIフレームが1つ挿入されます。(3フレーム毎などには挿入されないという事)
 

正直、この設定を変えても、目に見えて画質が変わるわけではないですし、ヘタすると画質が落ちてしまう可能性すらあります。

なので、「自分好みの設定にアレンジしてエンコードしてみたい!」という人以外は、デフォルト設定で問題ありません。

ちなみに先述した「動き予測アルゴリズム」は左上にある「動き予測」というグループの項目で設定できます。
あと、左の真ん中らへんにある「Bフレーム」というのは、その名の通り「Bフレーム」についての設定です。

WMV出力プラグイン plus

「WMV出力プラグイン plus」の場合は、

「Video」タブ→「Key frame interval」という項目で設定します。

wmv_キーフレーム

単位が「ms」なので、

例えば「30fps」の動画で「5000ms」と指定すれば、

5秒 × 30フレーム/秒 = 150フレーム

となり、150フレーム毎にキーフレームが差し込まれる事になります。

 

このページの情報は以上です。

コメント

  1. きんのすけ より:

    GOPをわかりやすく説明いただき、とても参考になりました。ありがとうございます。

    1つだけ、不明な点がありました。
    「wmv_キーフレーム」の記載で以下の通りありますが、単純に計算してしまうと、キーフレームが差し込まれるのは「5秒×30フレーム/秒=150フレーム毎」と思ったのですが。計算があわず、大変恐縮ですが、ご教示頂けると幸いです。

    —-
    単位が「ms」なので、例えば「30fps」の動画で「5000ms」と指定すれば30フレーム毎にキーフレームが差し込まれる事になります。

    • 管理人 より:

      ご指摘の通りです。
      修正させていただきました。

      あと、記事が全体的に見づらかったので、見やすくなるように修正しました。

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