Iフレーム
Intra-coded frame / アイフレーム
前後のフレームを参照せず、それ1枚だけで絵を復元できる圧縮フレームのことです。配信の頭出しや編集の切り取りはこのフレームを起点にするため、どの間隔で入れるかが再生と編集の両方に効きます。
- 意味
- 他のフレームを参照せずに符号化されたフレーム
- 別の呼び方
- キーフレーム、Iピクチャ、イントラフレーム
- データ量
- 同じ画でもPフレームやBフレームより大きい
- 特別なIフレーム
- IDRフレーム。H.264やHEVCで、以降のフレームにそれ以前を参照させない
- 間隔の指定
- FFmpegは `-g` にフレーム数、OBSやエンコーダの画面では秒で指定することが多い
- 全フレームをIにした方式
- オールイントラ。ProRes、AVC-Intra、DNxHDなど
- 確認方法
- ffprobeで `pict_type` を出すと I / P / B が並ぶ
配信サービスの設定画面に出てくる「キーフレーム間隔」も、編集ソフトで特定の位置がうまく切れないという困りごとも、行き着く先はIフレームです。Iフレームは1枚だけで絵を復元できるフレームで、再生を始められる場所も、きれいに切れる場所も、基本的にはここになります。
Iフレームが使われる場面
ライブ配信の設定では、Iフレームを何秒ごとに入れるかを指定します。OBSの「キーフレーム間隔」やFFmpegの -g がこれにあたり、YouTubeはライブ用エンコーダに2秒ごとを推奨しています。視聴者が途中から入ってきたとき、再生はIフレームから始まるので、間隔が長いと最初の絵が出るまで待つことになります。
オンデマンド配信でも同じです。HLSやMPEG-DASHは動画を数秒のセグメントに割り、そのセグメントの先頭はIフレーム、正確にはIDRフレームである必要があります。画質を切り替えるときは別のビットレートのセグメントに乗り換えるので、どの画質のファイルもIフレームの位置が揃っていなければなりません。エンコード時に位置を固定するため、FFmpegでは -force_key_frames を使います。
収録や編集の側では、Iフレームの多さがそのまま作業の軽さになります。ProResやAVC-Intraのように全フレームをIフレームにした素材は、どのコマで切っても前後を計算し直す必要がなく、スクラブもカットも軽く動きます。
Iフレームの仕組み、IDRフレームとの違い
Iフレームは他のフレームを見ずに、1枚の絵の中だけで圧縮します。JPEGに近い考え方で、画面を小さなブロックに分けて周波数に変換し、細かい成分を削ります。前のフレームとの差分を使わないぶんデータ量は大きく、同じ画質ならPフレームやBフレームの何倍かになります。
H.264やHEVCには、Iフレームの中でも特別なIDRフレームがあります。IDRが現れると、デコーダはそれまでのフレームをすべて忘れ、以降のフレームはIDRより前を参照しません。ふつうのIフレームは単独で復元はできるものの、後ろのフレームが「そのIフレームより前」を参照している場合があり、そこから再生を始めると絵が壊れます。配信の区切りにIDRが求められるのはこのためです。
GOPはIフレームから次のIフレームの手前までのまとまりを指す言葉なので、Iフレームの間隔を指定することとGOP長を決めることは同じ操作になります。
Iフレームで間違えやすい点
まぎらわしいのが、編集ソフトの「キーフレーム」です。After EffectsやPremiere Proでエフェクトの値の変化を打つ点もキーフレームと呼びますが、こちらは圧縮とは無関係です。書き出し設定の欄に出てくるキーフレームは圧縮のIフレーム、タイムラインのエフェクト欄に出てくるキーフレームはアニメーションの制御点で、別のものだと分けて考えてください。
もうひとつは、指定の単位です。FFmpegの -g はフレーム数なので、-g 60 は60fpsなら1秒、30fpsなら2秒になります。フレームレートを変えたら見直してください。x264などのエンコーダは場面が切り替わった瞬間にIフレームを自動で挿入する機能を持っていて、これが働くと間隔が不揃いになります。配信用に位置を揃えたいときは、シーン検出による挿入を切るか、キーフレームの位置を明示します。
よくある質問
Iフレームを増やすと画質は良くなりますか
同じビットレートなら、Iフレームを増やすほど1枚あたりに使えるデータが減るため、動きの多い映像では画質が落ちることもあります。増やして得られるのは頭出しの速さと編集のしやすさで、画質のためというより用途に合わせた選び方になります。
キーフレームとIフレームは同じものですか
圧縮の文脈では同じものを指します。ただし編集ソフトのタイムラインで使うキーフレームはアニメーションの制御点で、まったく別の意味です。
Iフレームの位置を確認する方法はありますか
ffprobeで -select_streams v -show_entries frame=pict_type を指定すると、フレームごとにI・P・Bのどれかが並んで出ます。Iが何フレームおきに現れるかを数えれば、実際の間隔が分かります。
この用語を扱ったコラム
似ている形式との違い
関連する用語
最終更新
