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 バイト)
  • 拡張ヘッダサイズ (4 バイト)
    • %0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
    • 拡張ヘッダサイズ領域(この 4 バイト)を除く。すなわち 6 バイト(CRC データがないとき)か 10 バイト(CRC データがあるとき)がセットされる
  • フラグ (2 バイト)
    • $x0000000 00000000
    • x - CRC データの有無
      • 1 がセットされているとき CRC データが存在する
  • パディング領域サイズ (4 バイト)
    • %0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
  • CRC データ (任意; 4 バイト)
    • %xx xx xx xx
    • 拡張ヘッダサイズが $00 00 00 0A 、拡張ヘッダフラグが $80 00 のとき CRC データが格納されている
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 バイト)
    • $00 (ID3v2.3, ID3v2.4)
      • ISO-8859-1 (Laten-1) で $00 で区切る
    • $01 (ID3v2.3)
    • $01 (ID3v2.4)
      • BOM 付き UTF-16 で $00 00 で区切る
    • $02 (ID3v2.4)
      • BOM なし UTF-16BE で $00 00 で区切る
    • $03 (ID3v2.4)
      • UTF-8 で $00 で区切る

$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)
  • フラグで添加されたデータ (任意; 可変長)
  • フレームフィールド (可変長)

で構成される。

フレームフラグ

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 - コメント

言語名は ISO-639-2 の 3 文字コードを用いる。日本語(jpn)、英語(eng)、フランス語(fre/fra)、スペイン語(spa)、ドイツ語(ger/deu)、ポルトガル語(por)、中国語(chi/zho)、ロシア語(rus)など。
<エンコード指定全文字列> は改行を含むことができる <エンコード指定文字列> 。

USLT - 非同期の歌詞

曲の位置と同期していない、単なる歌詞。
フィールド内容は "COMM" と同一。

APIC - 添付された画像

埋めこまれたジャケットなどの画像。

  • 文字コード指定子 (1 バイト)
    • $xx
  • MIME タイプ (可変長)
    • <文字列>
  • 区切り文字 (文字コードに関わらず 1 バイト)
    • $00
  • 画像タイプ (1 バイト)
    • $xx
  • 画像の説明 (可変長)
  • 区切り文字 (文字コードにより 1 バイトないし 2 バイト)
    • $00 (00)
  • 画像データ (可変長)
    • <バイナリデータ>

画像タイプは表カバーが $03 、裏カバーが $04 などと定義されている。

パディング領域

  • パディング領域
    • $00 00 00 ... 00

フッタ

  • 識別子 (3 バイト)
    • "3DI"
  • バージョン (2 バイト)
  • フラグ (1 バイト)
  • サイズ (4 バイト)

識別子以外ヘッダのコピー