Mitsugu Oyama のソフトウェア倉庫
 > その他技術資料
  > ogg コンテナ・フォーマット

Ogg コンテナの構造がある程度わかったのでメモしておく。Vorbisについては今回は触れない。またここでは便宜的に "Ogg コンテナ" と表記する。なおこのメモは必要に応じて適宜修正される。

Ogg コンテナのおおまかな構造は以下の通り。

  1. Ogg コンテナは一つあるいは複数の Ogg ページで構成されている
  2. Ogg ページはヘッダとセグメントで構成されている
  3. 各種コーデックでエンコードされたデータはセグメント内に置かれる

実際の Ogg コンテナは下図のような構造になっている。

┌──────┬──────┬──────┬──────┐
│     O      │      g     │      g     │     S      │
├──────┼──────┼──────┴──────┤
│    null    │ type  flag │                          │
├──────┴──────┘                          │
│              absolute granule position               │
│                          ┌─────────────┤
│                          │   stream serial number   │
├─────────────┼─────────────┤
│   stream serial number   │   page sequence number   │
├─────────────┼─────────────┤
│   page sequence number   │       CRC checksum       │
├─────────────┼──────┬──────┤
│       CRC checksum       │ segment No.│segemnt tbl │
├──────┬──────┴──────┼──────┤
│segemnt tbl │             ?            │segemnt tbl │
├──────┴─────────────┴──────┤
│                         segment                      │
├───────────────────────────┤
│                           ?                          │
├───────────────────────────┤
│                         segment                      │
└───────────────────────────┘
    

最初の 4byte には "OggS" というマジックコードが入っている。これらは普通の ASCII Code である。

たとえばデータが破損した場合など、次の "OggS" を見つけることで、つまり次の Ogg ページを見つけることで、再生を継続させることができるようになっている。

また Vorbis では複数のヘッダパケット ( 別エントリーに記載する ) を複数の Ogg ページに分割していることを実データで確認している。ただし Vorbis エンコーダの実装依存かもしれない。

次の null コードは Ogg のバージョンである。現時点では 0。将来変る予定も今のところはない。

1byte ( 8bit ) の type flag には以下のような意味がある。

x  x  x  x  x  x  x  x
                    │  │  └─ 0 = 最初の Ogg ページ
                    │  │       1 = 続きの Ogg ページ
                    │  │
                    │  └─── 0 = Ogg コンテナの最初の Ogg ページではない
                    │           1 = Ogg コンテナの最初の Ogg ページ
                    │
                    └───── 0 = Ogg コンテナの最後の Ogg ページではない
                                 1 = Ogg コンテナの最後の Ogg ページ
    

absolute granule position は Ogg コンテナにパッキングされる各種コーデックのタイムマーカーで、コーデックによって意味が異なる。

stream serial number はこの Ogg ページが属する Ogg コンテナのシリアルナンバーである。

page sequence number はこの Ogg ページの Ogg コンテナ上のシーケンスナンバーである。

CRC checksum はページのチェックサムで、このチェックサムを使って Ogg ページが破損しているか調べることができる。また調べなければならない。

segment No. にはセグメント・テーブルの数が格納される。またこれはセグメントの数でもある。0 ? 255 の値を持つ。Ogg ページは 最大 255 個のセグメント・テーブルを持つことができる。

segment tbl. はセグメント・テーブルである。セグメント・テーブルとはセグメントのヘッダのようなもので、セグメントのサイズを byte を単位として持つ。各セグメント・テーブルは 0 ~ 255 の値を持つことができる。つまりセグメントのサイズは最大 255 Byte である。

segment tbl. の最大値 255 と セグメント・テーブル内の最大値 255 からわかるように、Ogg ページ 1 ページ当り最大 65025 Byte までセグメントを確保することができる。また Ogg コンテナは複数の Ogg ページを持つことができる。コンテナの終端は type flag とセグメントの終端を検出することで判断する。

segment は flac、Vorbis、vp8、その他各種コーデックのデータが置かれる領域である。

資料
付録
Ogg Media Types