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

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

※動画をエンコードする際や、無劣化(再圧縮なし)で動画をカットしたい際などに役立つ知識です。

スポンサードリンク

動画の仕組みについて

30fpsイメージ

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

動画というのは、簡単に言ってしまえば「パラパラ漫画」です。

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

ただこの時、「画像」を全てそのまま「動画」に落とし込んでしまうと、3分で15GBなどというアホみたいにファイルサイズがデカい動画になってしまいます。(このような動画の事を「非圧縮動画」という)

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

圧縮方法について

圧縮の方法としては主に以下の2種類に分類出来ます。

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

例えば、ニュース番組とかでキャスターが淡々とニュースを読み上げているシーンなどでは、実際に動画として動いてるのは「口元」部分くらいで、その他の背景は殆ど変化しません。

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

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

例えば、全面空が広がるようなシーンでは、殆どの色情報が「青」に似たような色となります。

このような場合、例えば「A A A A A B B C C C B B」(データ量:12)というデータが有ったとしたら、

  • 5 A 2 B 3 C 2 B」(データ量:8)

という風に数学的にファイルを圧縮(ランレングス圧縮と言う)する方法を「フレーム内圧縮」と言います。

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

キーフレームとは

上述した「フレーム間予測」で圧縮する場合、1枚1枚の「画像」(フレーム)を、それぞれ「Iフレーム」「Pフレーム」「Bフレーム」に分ける事でフレーム間の圧縮をします。

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

  • Iフレーム:そのフレーム全ての情報を保持したフレーム(キーフレームの事)
    • ニュース番組を例に出すと、キャスター・背景の全てを含めたフレーム
  • Pフレーム:前の「Iフレーム」との差異を保存したフレーム
    • ニュース番組を例に出すと、キャスター・背景の全てを含めたフレーム
  • Bフレーム:前後の「Iフレーム」と「Pフレーム」「Bフレーム」の差異を保存したフレーム

もっと簡単に言うと、

  • 1フレームだけで完結しているのが「Iフレーム
  • 前の「Iフレーム」が参照しないと差分しか表現出来ないのが「Pフレーム
  • 前後の「Iフレーム」「Pフレーム」「Bフレーム」を参照しないと差分しか表現出来ないのが「Bフレーム

です。

キーフレーム」と言うのは「Iフレーム」の事を指しています。この「Iフレーム」が全ての大元です。

また、このように各フレームを「Iフレーム」「Pフレーム」「Bフレーム」に分けて分けて非可逆圧縮する技術の事を「GOP(Group of Picture)」といいます。MPEG系のコーデックの仕組みは全てコレです。(H.264・MPEG-4・MPEG-2・MPEG-1等)

ちなみに、動画を「GOP」単位でカットする事で「再圧縮無し」で無劣化編集出来ます。

図で表すと?

例えば、以下の様な感じで1フレーム、2フレーム、3フレームと「飛行機」が右に移動する動く動画が有ったとします。

1(Iフレーム) 2(Iフレーム) 3(Iフレーム)
キーフレーム キーフレーム1 キーフレーム2

▲この場合、これらは全て「Iフレーム」となります。(全ての情報を有しているので)

これらを「Pフレーム」「Bフレーム」で置き換えると以下のようになります。

1(Iフレーム) 2(Bフレーム or Pフレーム) 3(Bフレーム or Pフレーム)
キーフレーム b,pフレーム2 b,pフレーム1

▲この場合、2フレーム目と3フレーム目では、「飛行機」のデータだけを保持すれば良いので、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」「WMV出力プラグイン plus」などを例に、キーフレーム間隔の設定のやり方について紹介します。

x264guiEx

x264guiExでは、上タブの「フレーム」という設定欄の中の「GOP関連設定」というグループの中の項目にて設定出来ます。

x264guiex_gop_キーフレーム

項目についての解説です

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

基本的にはデフォルト設定で問題有りませんが、自分好みの設定にアレンジしてエンコードしてみたいって人は色々試して見ると良いかもしれません。

ちなみに先述した「動き予測アルゴリズム」は左上にある「動き予測」というグループの項目で設定出来ます。(自分で理解してからでないと変更するべきでない)

あと左の真ん中らへんにある「Bフレーム」っていうのは、その名の通り「Bフレーム」についての設定です。

WMV出力プラグイン plus

「WMV出力プラグイン plus」の場合は、「Video」タブの「Key frame interval」という項目で設定します。

wmv_キーフレーム

単位が「ms」なので、例えば「30fps」の動画で「5000ms」と指定すれば30フレーム毎にキーフレームが差し込まれる事になります。(5000~8000くらいが妥当)

x264guiExと違って、そこまで細かい指定は出来ません。

スポンサーリンク