AVIF ファイル形式
AV1 Image File Format。AV1 動画コーデックをベースにした最新の静止画形式。
- MIME タイプ
- image/avif
- 拡張子
- .avif
- カテゴリ
- 画像
マジックナンバー(ファイル署名)
| 0x00000004 | 66747970 | ftyp | ISO-BMFF 'ftyp' box |
| 0x00000008 | 61766966 | avif | brand 'avif' |
AVIF 形式について
AVIF は AV1 動画コーデックを静止画に適用したもので、HDR と広色域に対応しながら非常に高い圧縮率を実現します。MP4 と同じ ISO-BMFF ファイルで、オフセット 4 の ftyp ボックスがブランド avif を持ちます。この最初のボックスから先は位置が固定されているものが何ひとつありません。ISO-BMFF は、それぞれが自分のサイズと 4 文字の型で始まるボックスの木構造だからです。AVIF の絵はトラックではなく meta ボックスの中のアイテムとして格納されていて、同じコンテナを共有する動画ファイルと静止画を分けているのは、まさにこの点です。
ヘッダーの構造(バイト単位)
| オフセット | 長さ | フィールド | 意味 |
|---|---|---|---|
| 0 | 4 | ftyp box size | ファイルタイプボックスの長さをビッグエンディアンで表したもので、この 4 バイト自体を含みます。ブランド 1 つと互換ブランド 2 つなら 00 00 00 18、つまり 24 が一般的です。RIFF 系と違って ISO-BMFF の数値はすべてビッグエンディアンです。サイズが 1 なら型の後ろに 64 ビットの長さが続き、0 ならボックスはファイル末尾まで伸びます。 |
| 4 | 4 | Box type | 66 74 79 70、ASCII の ftyp。ファイルタイプボックスは先頭に置くことが要求されているので、他に固定位置を持つものが何もないこの形式でも、オフセット 4 だけは当てにできます。このバイト範囲は AVIF・HEIC・HEIF・MP4・MOV・3GP が等しく共有しています。 |
| 8 | 4 | Major brand | 静止画なら 61 76 69 66。画像シーケンスとアニメーション AVIF は代わりに 61 76 69 73、つまり avis を使うので、アニメーションと静止画はここで 1 バイトしか違わないのに、デコードの仕方は大きく異なります。 |
| 12 | 4 | Minor version | 解析には影響しない参考情報で、ほぼ必ず 00 00 00 00 です。ブランドのバージョンではありませんし、この値を理由にファイルを拒否することはどのリーダーにも許されていません。 |
| 16 | variable | Compatible brands | 4 バイトずつ並び、ボックスの残りを埋めます。24 バイトの ftyp ならちょうど 2 つ入ります。macOS が作ったファイルは avif と mif1 を並べ、ウェブ用エンコーダのファイルは miaf と MA1B のようなコーディング制約ブランドを足すことがよくあります。リーダーはこのリストのどれか 1 つでも認識できればファイルを開いてよく、メジャーブランドだけでは決め手にならないのはそのためです。 |
| 24 | 4 | Next box size | 24 バイトの ftyp の直後から、次のボックスヘッダが始まります。ボックスは各サイズを現在位置に足しながら歩くので、ここのサイズが 1 つ狂うと以降のファイルすべてを失います。ISO-BMFF には再同期の仕組みがどこにもありません。 |
| 28 | 4 | Next box type | たいていは 6D 65 74 61、つまり meta で、これを静止画ファイルたらしめているアイテム一覧・アイテム属性・アイテム位置を保持するボックスです。代わりに trak ボックスが見つかったなら、拡張子が何であれ中身は動画です。 |
似た形式との見分け方
| 紛らわしい形式 | 見分け方 |
|---|---|
| HEIC | 同じコンテナ、同じ先頭 8 バイトで、決め手はオフセット 8 の 4 バイトだけです。61 76 69 66 なら AV1 符号化、68 65 69 63 なら HEVC 符号化。実務上の違いは構造ではなくライセンスにあり、今のブラウザはどれも AVIF をデコードできて、HEIC は Safari 以外どれもデコードできません。圧縮された画像データが別コーデックである以上、remux をどれだけ重ねても一方が他方に変わることはありません。 |
| HEIF | 見た目より厄介です。AVIF ファイルは互換ブランドに mif1 を並べているからです。macOS が作った AVIF はオフセット 8 が avif で、オフセット 20 が mif1 なので、ftyp ボックス内のどこかにある mif1 を拾う検出器はこれを HEIF と呼びます。ファイルが第一に何を名乗っているかを決めるのは、オフセット 8 のメジャーブランドだけです。 |
| MP4 | オフセット 4 は同一で、違うのはオフセット 8 のブランドだけです。動画なら isom・mp42・avc1・dash、画像なら avif か avis。より深い判定は構造で、静止画は絵を meta ボックス配下のアイテムとして格納し、動画は trak ボックスが記述するサンプルとして格納します。avis のシーケンスは、その境界を意図的にぼかす存在です。 |
| WebP | 52 49 46 46 と 4 バイトのボックス長なので、バイトレベルで紛れることはありません。picture 要素の同じ枠を奪い合う関係で、トレードオフは一貫しています。AVIF は同画質の WebP より 20〜50 パーセント小さく、エンコードには 1 桁長い時間がかかります。 |
よくある壊れ方
- 途中切れ。寸法とアイテム属性を運ぶ meta ボックスはたいてい前のほうにあるので、デコーダは画像サイズを平然と報告したうえで画素を 1 つも見つけられません。タイル化された画像なら最初のタイルだけ、ということもあります。mdat ボックスが切れているためです。無事な AVIF は最後のボックスがちょうどファイル末尾で終わるので、そこを確認してください。
- ボックスサイズの誤り。ボックスはサイズを足しながら歩くので、長さが 1 つ狂うとパーサは別のボックスのペイロードの真ん中に着地し、任意の 4 バイトを型として読みます。バイトはすべて残っているのに破損箇所より後ろのボックスは全滅し、そのときのエラーはまったく無関係なボックスが壊れているように見えます。
- 画像シーケンスを静止画として保存した場合。avis ブランドのファイルは複数フレームを持ちますが、静止画 AVIF しか実装していないソフトウェアは 1 枚目を描いて成功を報告します。壊れてはいません。他のフレームが単に出てこないだけで、表示された絵に対してファイルサイズだけが説明のつかない大きさに見えます。
- 色関連の属性が欠けているか誤っている場合。AVIF は色域プライマリ・伝達関数・マトリクスをアイテム属性として持ちますが、変換ツールがそれを落とすとデコーダは推測するしかなくなります。HDR 画像は構造的には正しいまま、色あせた、あるいは過飽和の SDR として描かれます。AVIF があるブラウザでおかしく見えて別のブラウザで正しく見えるのは、これが原因です。
- ソフトウェアがファイルに対して古すぎる場合。AVIF がブラウザに来たのは 2020〜2022 年で、デスクトップやサーバのソフトウェアにはいまだデコードできないものが山ほどあります。Chrome で開けて他では全滅するファイルは、たいてい壊れていません。オフセット 4 が ftyp、オフセット 8 が avif と読めることを確認すれば破損は除外できます。
この形式の現在地
AVIF は、ブラウザ対応が本当に広い形式のなかで最も圧縮率が高いものです。Chrome は 2020 年、Firefox は 2021 年、Safari は 2022 年から使えるので、picture 要素とフォールバックをすでに配っているサイトの写真コンテンツなら既定にして構いません。同画質の JPEG に対しておおむね半分のバイト数、WebP に対して 20〜50 パーセント削れます。加えて、古い形式にはそもそも無い機能を持ち込みます。チャンネルあたり 10 ビットと 12 ビット、HDR の伝達関数、広色域、フィルムグレイン合成、アルファ、アニメーションが 1 つのコンテナに収まります。代償はエンコード時間で、JPEG の 1〜2 桁上になります。スマートフォンやブラウザのアップロード経路でその場で作る形式ではなく、ビルドステップか CDN の形式ということです。ブラウザの外の対応はまだまだで、デスクトップのエディタ、メールクライアント、古い Android には開けないものが多くあります。ファイルとして人に手渡すには、まだ安全な形式とは言えません。現実的な構成は、大手サイトの多くが実際にそうしているように、picture 要素で AVIF を第一、WebP を第二、JPEG を最後に置くことです。
AVIF ファイルをこのサイトで開く
どれもブラウザ内で動きます。ファイルが端末から出ることはありません。
関連する形式
AVIF と混同しやすい形式です。先頭バイトを見比べてください。