カクタスソフトウェア
カクタスソフトウェア
サウンド MIDI マルチメディア アプリケーション

オーディオタグID3v2

バージョン2のID3v2タグは、フレームに多くの情報を含めることができる柔軟な構造をしています。通常ファイルの先頭に付加されます。以下に構造を示します。

領域 長さ(バイト) 説明
ヘッダ 10 必須
拡張ヘッダ 可変長 省略可能
フレーム 可変長 必要なものを記述
Padding領域 可変長 省略可能
フッタ 10 省略可能

ヘッダ

長さ10バイトの固定エリアです。以下に構造を示します。

typedef struct tagID3V2HEADER
{
    char        tag[3];
    char        version[2];
    char        flags;
    char        size[4];
} ID3V2HEADER;

タグ

3バイトのエリアで文字列”ID3”が格納されています。この文字列を手がかりにID3v2タグを探します。

バージョン

2バイトのエリアでバージョンを記述します。始めの1バイトはメジャーバージョンで、次の1バイトは改定番号です。

フラグ

1バイトのエリアでフラグを記述します。

A B C D 0 0 0 0
  名称 長さ(Bit) 数値 意味
A 非同期化 1 0 非同期化処理を行わない
1 非同期化処理を行う
B 拡張ヘッダ 1 0 拡張ヘッダなし
1 拡張ヘッダあり
C 実験中 1 0 実験段階ではない
1 タグが実験段階にある
D フッタ有り 1 0 フッタなし
1 フッタ有り

残りの4ビットは必ずゼロにすること。

非同期化処理
サウンドデータが収められているフレームは、セットされたビットが11個続くことで識別されます。しかし万一ID3v2タグの中に11ビット以上1が連続する部分があると、フレームの先頭とまちがえる恐れが出てきます。非同期化は、11ビット以上1が連続する部分を次の様に置き換え、まちがった識別が起こらないようにします。
11111111 111xxxxx 置き換え前
11111111 00000000 111xxxxx 置き換え後
非同期化は、ファイルを頭から順にスキャンするタイプのソフトウェア・ハードウェアへの配慮で、ID3v2タグの構造を理解しているソフトウェア・ハードウェアには必要ありません。

サイズ

4バイトのエリアで可変長領域(拡張ヘッダ・フレーム・Padding領域)の合計サイズが記録されています。有効な数値は、各バイトの下位7ビットに記述されています(Synchsafe整数)。サイズを求めるには、これらのビット列をつなぎ合わせる必要があります。以下にサイズを求めるコード例を示します。

    DWORD nTagSize = 0;

    for (int i=0; i<4; ++i)
    {
        nTagSize *= 128;
        nTagSize += pId3v2->size[i] & 0x7f;
    }

ID3v2タグ全体のサイズを求めるには、上記の可変長領域のサイズにヘッダサイズ10バイトを加えます。さらにフラグでフッタがあると示されていれば、フッタの10バイトを加算します。

Synchsafe整数
Synchsafe整数は下位7ビットのみを使って数値を表現する方式です。数値のバイナリ表現は11ビット以上1が連続する場合があります。Synchsafe整数は連続した1によってフレームの先頭とまちがえることを防止するための措置です。

拡張ヘッダ

拡張ヘッダの先頭には4バイトのSynchsafe整数でヘッダサイズが記録されています。それ以降、CRCデータやタグの制限事項などタグに関する詳細な情報が続きます。しかしこれらはタグの解析に必ず必要というわけではないので省略することができます。

拡張ヘッダはバージョンによって定義が異なるため利用には注意が必要です。

拡張ヘッダはmpeg3の再生に直接関連しないので、詳しい解説は省略します。拡張ヘッダに関する詳しい内容は巻末で紹介する文献を参照して下さい。

Padding領域

可変長領域の長さは正しくヘッダに記録しなければなりません。フレームにすべての情報を書き終えるまで正確な長さが分からない場合、少し多めの数値をヘッダに記録し、フレームを書き終えた後、余ったバイトをNULLで埋める処置を行います。このNULLで埋めた領域をPadding領域と言います。Padding領域を作ることでヘッダを書き換える手間を省くことができます。

フッタ

フッタはファイルの後方からヘッダの内容を検索する時に使います。内容はヘッダと同じものが記述されています。ただしタグは”3DI”とヘッダの逆順となっています。フッタは省略することができます。

typedef struct tagID3V2FOOTER
{
    char        tag[3];
    char        version[2];
    char        flags;
    char        size[4];
} ID3V2FOOTER;

フレーム

フレームは様々な情報を格納するための可変長エリアです。情報の種類はIDによって識別されます。以下にフレームのヘッダ部分を示します。

typedef struct tagID3V2FRAME
{
    char        id[4];
    char        size[4];
    char        flags[2];
} ID3V2FRAME;

ID

フレームは先頭の4文字のIDによって識別されます。※フレームID参照

サイズ

フレームのサイズを示します。4バイトのエリアでSynchsafe整数で表現されます。この数値はフレームヘッダのサイズを含みません。

フラグ

2バイトのエリアでフラグを記述します。フラグの初期値はデフォルトですべてゼロとなっています。

0 A B C 0 0 0 0 0 H 0 0 K M N P
  機能 長さ(Bit) 数値 意味
A タグを変更した時にフレームを保存するか 1 0 フレームを保存する
1 フレームを破棄する
B ファイルを変更した時にフレームを保存するか 1 0 フレームを保存する
1 フレームを破棄する
C 読み込み専用のフレームか 1 0 変更可能
1 読み込み専用
H 他のフレームとグループを形成するか 1 0 グループ情報が存在しない
1 グループ情報が存在する
K 圧縮されているか 1 0 圧縮されていない
1 圧縮されている
M 暗号化されているか 1 0 暗号化されていない
1 暗号化されている
N 非同期化処理がされているか 1 0 非同期化処理されていない
1 非同期化処理されている
P データ長指定子は追加されているか 1 0 データ長指定子が追加されていない
1 データ長指定子が追加されている

A・Bはタグやファイルの内容を変更した時、そのフレームを残すか破棄するかを指定します。

Cのビットがセットされている場合、フレーム内容は変更できません。署名などのフレームでCがセットされているにもかかわらず、内容を書き換えた場合、元の署名を破棄したことになるので、Cをリセットしなければなりません。

Hは複数のフレームがグループを形成していることを示します。Hがセットされている場合、グループを識別する「グループ識別子」が1バイト追加されます。

Kはフレームが圧縮されているかどうかを示します。圧縮されている時は、Pフラグをセットし必ずデータ長指定子を追加しなければなりません。

データ長指定子は4バイトのエリアでSynchsafe整数で記述されます。

フレーム内容

フレームIDは非常に多くの種類が定義されています。ここでは代表的なものを紹介します。

具体的なフレームの内容は、フレームタグの直後に配置され、長さはタグで示されます。

フレームID 説明
UFID ファイルを一意的に識別するためのユニークな識別子
TIT2 タイトル/曲名/内容の説明
TPE1 主なアーティスト/主な演奏者/ソリスト/演奏グループ
TRCK トラックの番号/セット中の位置
MCDI 音楽CD識別子

フレームに関する情報は多岐にわたるため、詳しい内容は巻末で紹介する文献を参照して下さい。

ドキュメントの先頭へ

カクタスソフトウェア 技術協力 資料室 資料室の広場 SourceForge.jp お問い合わせ