アカベコマイリ

HEAR NOTHING SEE NOTHING SAY NOTHING

ID3v2 ヘッダー

ID3v2 ヘッダーはファイルの先頭に記録される 10 Byte のデータ。

ヘッダー構造

ヘッダー構造について。

ファイル先頭から 3 Byte 読み込み、それらを ASCII 文字列に直したとき “ID3” となっていれば ID3v2 タグの始点となる。

次に 2 Byte のバージョン情報が続く。これは { バージョン、リビジョン番号 } の順に並んでいる。ID3v2 と表記されているので、ID3 のバージョン 2 と勘違いしそうになるが、これは ID3v2 という規格であり、バージョンが 3 なら ID3v2 の 3 で ID3v2.3 となる。

バージョンが未知のものならば、タグの読み書きをおこなうべきではない。ID3v2 の仕様は前方互換を保証していない。

サイズはタグ情報全体からヘッダー部分を差し引いた値となる。これは全体としては 4 Byte (32 bit) だが有効範囲は 28 bit なので注意する。例えばタグ情報のサイズが 257 Byte の場合は $00 00 02 01 と表現される。

Byte内容
0"I"タグ ID
1"D"*
2"3"*
3$02$03$04バージョン
4$00*
5%ab000000フラグ
6$xxサイズ
7$xx*
8$xx*
9$xx*

フラグ

フラグの内容は以下のようになる。1 Byte の値に複数の bit フラグが設定されているので、チェックする場合は、左から 0x800x400x20、…etc を AND 演算して 1 になっていることを確認する。

bit76543210
v2.2非同期化圧縮000000
v2.3非同期化拡張ヘッダー実験中00000
v2.4非同期化拡張ヘッダー実験中00000

非同期フラグが有効ならば、ヘッダー以降のデータを読み取る前にデータを復元する必要がある。

ID3v2 はファイルの先頭に書かれる。しかし古い MP3 プレーヤーでは ID3v2 を判別できないため、この部分がそのまま音声データとして再生される可能性がある。この誤認は同期信号と呼ばれる一定のパターンが登場することによって発生するため、そのようなデータを適切にエスケープすることで音声と認識されることを防ぐ。

例えば %11111111 111xxxxx というデータがあれば %11111111 00000000 111xxxxx のように変換する。この処理を非同期化と呼ぶ。

ID3v2.2 の場合、圧縮というフラグが用意されているが用途不明。ID3v2.3 以降はここに拡張ヘッダー所有フラグが設定される。これが有効な場合はヘッダーの後に拡張ヘッダーが続く。

実験中フラグはタグ情報が実験段階であることを示す。開発者向けに使用されるフラグと思われる。

ID3v2 拡張ヘッダー

拡張ヘッダーは ID3v2.3 から追加されたデータで、付加情報を表す。

タグ解析に必須ではないため、省略してもよい。もし追加する場合は、ID3v2 ヘッダーに拡張ヘッダーの所有フラグを立てたうえで、ID3v2 ヘッダーの直後に追加する。

データ構造としては以下のようになる。

v2.3

Byte内容
0サイズ
1*
2*
3*
4フラグ
5*
6パディング領域サイズ
7*
8*
9*
10CRC-32
11*
12*
13*

v2.4

Byte内容
0サイズ
1*
2*
3*
4フラグ長
5フラグ
6CRC-32
7*
8*
9*
10*
11制限情報フラグ
12未使用
13*

フラグ

フラグは ID3v2.3 が 2 Byte (16 bit)、v2.4 は 1 Byte (8 bit) となる。フラグの bit 構成は以下。

v2.3

bit内容
7CRC あり
60
50
40
30
20
10
00

|v2.4|フラグ長が入るので未使用|0|更新状態|CRC あり|制限情報あり|0|0|0|0|

v2.4

bit内容
7フラグ長が入るので未使用
6*
5*
4*
3*
2*
1*
0*
70
6更新状態
5CRC あり
4制限情報あり
30
20
10
00

制限情報フラグ

制限情報フラグは ID3v2.4 からの仕様で、拡張ヘッダーのフラグに指定があるときに設定される。

bit内容
7タグ サイズ
6*
5文字コード
4テキスト文字数
3*
2画像フォーマット
1画像サイズ
0*

それぞれのフラグには、以下の値が設定される。

フラグ内容
タグサイズ00 = フレーム数 128 サイズ 1MB まで、01 = フレーム数 64 サイズ 128KB まで、10 = フレーム数 32 サイズ 40 KB まで、11 = フレーム数 32 サイズ 4KB まで。
文字コード0 = 制限なし、1 = ISO-8859-1 または UTF-8 のみ。
テキスト文字数00 = 制限なし、01 = 1024 文字、10 = 128 文字、11 = 30 文字。
画像フォーマット0 = 制限なし、1 = PNG または JPEG (JFIF) のみ。
画像サイズ00 = 制限なし、01 = 256x256 ピクセルまで、10 = 64x64 ピクセルまで、11 = 64x64 ピクセルのみ。