Mitsugu Oyama のソフトウェア倉庫
 > その他技術資料
  > vorbis フォーマット

【注】コメントヘッダから文字情報を取得することを目的とするためコメントヘッダ以外の説明を大幅に省略している。

Vorbis ビットストリームのヘッダは三つある。識別ヘッダ、コメントヘッダ、セットアップヘッダの三つだ。これら三つのヘッダはパケットという単位で今あげた順にならんでいる

共通ヘッダ

パケットには共通ヘッダと呼ばれるブロックがある。この共通ヘッダは Vorbis の場合 7 Byte のサイズがあり、は下図のような構造になっている。

┌──────┬──┬──┬──┬──┬──┬──┐
│packet type │'v' │'o' │'r' │'b' │'i' │'s' │
└──────┴──┴──┴──┴──┴──┴──┘
    

1byte のデータ packet type にはパケットに含まれるヘッダの種類が格納される。

1 :パケットは識別ヘッダ
3 :パケットはコメントヘッダ
5 :パケットはセットアップヘッダ

識別ヘッダ

識別ヘッダは下図に示す構造を持っている ( 図の横幅が bit 数の比率を表しているわけではないことに注意 )。

┌──┬──┬──┬──┬──┬──┬──┐
│ 1  │'v' │'o' │'r' │'b' │'i' │'s' │ 各 8bit
├──┴──┴──┴──┴─┬┴──┴──┘
│      vorbis version      │ 32bit unsigned integer
├─────────────┤
│         channels         │  8bit unsigned interger
├─────────────┤
│       sample late        │ 32bit unsigned integer
├─────────────┤
│     bitrate maximum      │ 32bit signed integer
├─────────────┤
│     bitrate nominal      │ 32bit signed integer
├─────────────┤
│     bitrate minimum      │ 32bit signed integer
├─────────────┤
│ block size 0 block size 1│  8bit unsigned char
├─────────────┤
│       flaming flag       │  8bit unsigned char
└─────────────┘
    
vorbis version :Vorbis のバージョン No. 0 がセットされる。
channels :オーディオ・チャンネル数
sample late :サンプリング・レート
bitrate maximum :最大ビットレート ( 参考値 )
bitrate nominal :公称ビットレート ( 参考値 )
bitrate minimum :最小ビットレート ( 参考値 )
block size 0 :仕様書に何なのかが書かれていない。サイズは 4bit。
block size 1 :仕様書に何なのかが書かれていない。サイズは 4bit。
flaming flac :仕様書に何なのかが書かれていない。0 以外の値がセットされている。またされていなければならない。

コメント・ヘッダ

コメントヘッダは下図に示す構造を持っている。

┌──────┬──────┬──────┬──────┬──────┬──────┬──────┐
│     3      │    'v'     │    'o'     │     'r'    │     'b'    │     'i'    │     's'    │
├──────┴┬─────┴──────┴──────┼──────┴──────┴──────┘
│vendor length │                                        32bit unsigned integer
├───────┴───────────────────┐
│                     vendor string                    │sizeof( vendor length ) byte
├────────────┬──────────────┘
│user comment list length│                              32bit unsigned integer
├────────────┤
│   user comment length  │                              32bit unsigned integer
├────────────┴──────────────┐
│                     user comment                     │sizeof( user comment length ) byte
├────────────┬──────────────┘
│
│                        ?
│
├────────────┤
│   user comment length  │                              32bit unsigned integer
├────────────┴──────────────┐
│                     user comment                     │sizeof( user comment length ) byte
├────────────┬──────────────┘
│       framing bit      │                              8bit
└────────────┘
    
vendor length :byte を単位とする vendor string の大きさ
vendor string :ベンダーの名前 ( UTF-8 )
user comment list length :ユーザコメント数
user comment length :byte を単位とする user comment の大きさ
user comment :ユーザコメント ( UTF-8 )
framing bit :用途不明。ただし 0 の場合はエラーとしなければならない。

vendor string、user comment は C の文字列のように終端に null 文字を持たない。文字の並びの前に必ず長さを持つので ( vendor length、user comment lenght )、それを参照して文字の数を得て処理を行わなければならない。

また user comment length と user comment はワンセットとなっており、user comment list length 回、これらのセットが繰り返し並んでいる。つまり user comment list length はユーザコメント数と理解するのがよい。

ユーザコメントはフィールド名とフィールド値を '=' でつないだものである。

たとえばアーティスト名であれば ARTIST=King Crimson のようになる。この例の user comment length は 19 ( Byte ) となる。

フィールド名の標準化されているものとして TITLE、VERSION、ALBUM、TRACKNUMBER、ARTIST、PERFORMER、COPYRIGHT、LICENSE、ORGANIZATION、DESCRIPTION、GENRE、DATE、LOCATION、CONTACT、ISRC などがあるが、必須というわけではない。実際に jamendo で公開されている楽曲でユーザコメントがないものもある ( user comment list length が 0 )。

セットアップヘッダについては省略するが、必要に応じて追記する。