ID3v2
ID3v2.3 と ID3v2.4 に関するメモ。見にくいけれど、併記しながら整理。簡単な読み取りさえできればよいので、フラグなど適当に説明を省く。
表記規則
- "str"
- 文字列 "str"
- $FF
- 16 進法で 0xFF
- %11111111
- 2 進法で 0b111111111
構成
- ヘッダ (必須; 10 バイト)
- 拡張ヘッダ (任意)
- ID3v2.3 は 10 バイトか 14 バイト
- ID3v2.4 は 6 バイト以上
- フレーム (必須)
- パディング領域 (任意; 可変長)
- フッタ (任意; 10 バイト)
- ID3v2.4 のみ対応
ヘッダ
- ファイル識別子 (3 バイト)
- "ID3"
- バージョン (2 バイト)
- $03 00 (ID3v2.3.0)
- $04 00 (ID3v2.4.0)
- フラグ (1 バイト)
- %abc00000 (ID3v2.3)
- %abcd0000 (ID3v2.4)
- b - 拡張ヘッダの有無
- 1 がセットされているとき、ヘッダの直後に拡張ヘッダがある
- サイズ (4 バイト)
- %0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
- ヘッダとフッタを除く、拡張ヘッダ、フレームとパディング領域のバイト数
サイズの求め方
各バイトの最上位ビットを無視した 28 ビットとして計算する
size = (s[0] << 21) + (s[1] << 14) + (s[2] << 7) + s[3]
拡張ヘッダ
ID3v2.3 (10 バイトないし 14 バイト)
ID3v2.4 (6 バイト以上)
- 拡張ヘッダサイズ (4 バイト)
- %0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
- 拡張ヘッダサイズ領域を含む。したがって最低 6 バイト
- フラグ情報の大きさ (1 バイト)
- $01
- ID3v2.4 は 1 バイトで決め打ちっぽい。将来大きくなる可能性があるのかも
- 拡張ヘッダフラグ (1 バイト)
- %0bcd0000
- 各フラグがオンになるとき、更に拡張ヘッダにデータが添加される
- b
- $00 が添加される
- c - CRC データの有無
- $05 %0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
- 上記の 6 バイトが添加される
- d - タグの制限
- $01 %ppqrrstt が添加される
- フラグによって添加されたデータ (任意; 可変長)
文字列
フレームに埋め込む文字列は内容によって文字コードや改行の許可の有無などが違ってくる。複数の文字コードを許容する場合、文字コードを明示する指定子が現れる。また、文字列を区切る必要があるとき、文字コードの種類によって $00 ないし $00 00 で区切るかわかれる。
- 文字コード指定子 (1 バイト)
$01 のときは、文字列の先頭に BOM ($FF FE ないし $FE FF)をつける。区切り文字に関しては、まとめて $00 (00) と記述される。
フレーム
- フレームヘッダ (10 バイト)
- フレーム ID (4 バイト)
- A-Z 0-9 の 4 文字で構成される
- フレームサイズ (4 バイト)
- %0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
- フレームヘッダ(10 バイト)を含まない
- フラグ (2 バイト)
- %abc00000 %ijk00000 (ID3v2.3)
- %0abc0000 %0h00kmnp (ID3v2.4)
- フレーム ID (4 バイト)
- フラグで添加されたデータ (任意; 可変長)
- フレームフィールド (可変長)
で構成される。
フレームフラグ
ID3v2.3
- i - 圧縮されているか
- このフラグがオンのときはフレームヘッダの後ろに伸張後のサイズが 4 バイトで添加される
- j - 暗号化されているか
- このフラグがオンのときはフレームヘッダの後ろに 1 バイトの暗号化手法の情報が添加される
- k - グループ化
- このフラグがオンのときはフレームヘッダの後ろに 1 バイトのグループ識別子が添加される
ID3v2.4
- h - グループ化
- このフラグがオンのときはフレームヘッダの後ろに 1 バイトのグループ識別子が添加される
- k - 圧縮されているか
- このフラグがオンのときはデータ長指定子フラグをセットする必要がある
- m - 暗号化されているか
- このフラグがオンのときはフレームヘッダの後ろに 1 バイトの暗号化手法の情報が添加される
- データ長指定子フラグをセットする必要があるかは手法による
- p - データ長識別子
- このフラグがオンのときは 4 バイトのデータ長識別子が追加される。これはすべてのフラグが 0 のとき(フラグによる情報添加がゼロのとき)のフレームサイズを、最上位ビットを 0 として表したもの
主なフレーム
UFID - 一意なファイル識別子
- 所有者識別子 (可変長)
- <文字列>
- 区切り文字 (1 バイト)
- $00
- 識別子 (可変長 <= 64)
- 64 文字以下のバイナリデータ
<文字列> は ISO-8859-1 (Laten-1) でエンコードされ改行が許されない文字列。
Txxx - 文字情報
"TXXX" を除く T から始まるフレーム。曲名である "TIT2" やトラック情報 "TRCK" が含まれる。
TXXX - ユーザ定義文字情報
ユーザが定義した項目とそれに対する文字情報を格納する。
COMM - コメント
- 文字コード指定子 (1 バイト)
- $xx
- 言語名 (3 バイト)
- $xx xx xx
- 短い説明 (可変長)
- <エンコード指定文字列>
- 区切り文字 (文字コードにより 1 バイトないし 2 バイト)
- $00 (00)
- 実際の文字 (可変長)
- <エンコード指定全文字列>
言語名は ISO-639-2 の 3 文字コードを用いる。日本語(jpn)、英語(eng)、フランス語(fre/fra)、スペイン語(spa)、ドイツ語(ger/deu)、ポルトガル語(por)、中国語(chi/zho)、ロシア語(rus)など。
<エンコード指定全文字列> は改行を含むことができる <エンコード指定文字列> 。
USLT - 非同期の歌詞
曲の位置と同期していない、単なる歌詞。
フィールド内容は "COMM" と同一。
パディング領域
- パディング領域
- $00 00 00 ... 00
フッタ
- 識別子 (3 バイト)
- "3DI"
- バージョン (2 バイト)
- フラグ (1 バイト)
- サイズ (4 バイト)
識別子以外ヘッダのコピー
仕様の情報
- ID3v2.3
- ID3v2.4
- ID3v2.3, ID3v2.4 (, ID3v2.2) 定義済みフレーム名一覧