動画のおける「キーフレーム」の意味について紹介します。
動画の仕組み
キーフレームについて説明する前に、「動画の仕組み」について簡単に説明します。
動画の仕組みは、ザックリ言うと「パラパラ漫画」です。
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」単位でカットする事で「再圧縮なし」で無劣化編集できます。
図で表すと?
例えば、以下の様な感じで
- 1フレーム目
- 2フレーム目
- 3フレーム目
と「飛行機」だけが右に移動する動く動画があったとします。
▲1フレーム目 (Iフレーム) | ▲2フレーム目 (Iフレーム) | ▲3フレーム目 (Iフレーム) |
この場合、
これらのフレームは全て「Iフレーム」となります。
なぜなら、全てのフレームがすべての情報を有しているからです。
そして、これらの「2フレーム目」「3フレーム目」を
- Pフレーム
- Bフレーム
に置き換えるとすると、以下のようになります。
▲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関連設定」というグループの中の項目にて設定できます。
|
正直、この設定を変えても、目に見えて画質が変わるわけではないですし、ヘタすると画質が落ちてしまう可能性すらあります。
なので、「自分好みの設定にアレンジしてエンコードしてみたい!」という人以外は、デフォルト設定で問題ありません。
WMV出力プラグイン plus
「WMV出力プラグイン plus」の場合は、
「Video」タブ→「Key frame interval」という項目で設定します。
単位が「ms」なので、
例えば「30fps」の動画で「5000ms」と指定すれば、
5秒 × 30フレーム/秒 = 150フレーム
となり、150フレーム毎にキーフレームが差し込まれる事になります。
このページの情報は以上です。
コメント
GOPをわかりやすく説明いただき、とても参考になりました。ありがとうございます。
1つだけ、不明な点がありました。
「wmv_キーフレーム」の記載で以下の通りありますが、単純に計算してしまうと、キーフレームが差し込まれるのは「5秒×30フレーム/秒=150フレーム毎」と思ったのですが。計算があわず、大変恐縮ですが、ご教示頂けると幸いです。
—-
単位が「ms」なので、例えば「30fps」の動画で「5000ms」と指定すれば30フレーム毎にキーフレームが差し込まれる事になります。
ご指摘の通りです。
修正させていただきました。
あと、記事が全体的に見づらかったので、見やすくなるように修正しました。