0

私は最近 ID3v2.4.0 に取り組んでいます。2.4.0 ドキュメントを読んで、理解できない特定の部分を見つけました - 同期セーフ整数。ID3v2 がこの方法を使用するのはなぜですか?

もちろん、ID3v2 が非同期方式を使用する理由はわかっています。これは、MPEG デコーダーが ID3 タグを MPEG 同期データと見なさないようにするために使用されます。しかし、私が理解できなかったのは、非同期化スキームの代わりに同期セーフ整数を使用する理由 (= $00 の挿入) です。

$00 を挿入する代わりに、タグのサイズを表現するときに同期セーフ整数を採用する理由はありますか? これらの 2 つの方法では、まったく同じ結果が得られます。 

ID3v2 ドキュメントによると、同期されていないデータのサイズは事前にわかりません。しかし、その声明は意味がありません。タグデータがバッファに格納されている場合、問題のある文字を $FF 00 に置き換えるだけで、非同期データのサイズを知ることができます。

私を助けてくれる人はいますか?

4

1 に答える 1

2

簡単にするために、非同期/同期スキームは、mpeg ファイルで使用する場合にのみ意味があります。

4 バイトを読み込んで通常の整数に変換するのは簡単です。

// pseudo code
uint32_t size;
file.read( &size, sizeof(uint32_t) );
size =   (size & 0x0000007F) |
       ( (size & 0x00007F00) >> 1 ) |
       ( (size & 0x007F0000) >> 2 ) |
       ( (size & 0x7F000000) >> 3 );

フレーム データと同じ非同期方式を使用している場合は、各バイトを個別に読み取り、FF00 パターンを探し、バイトごとに整数を再構築する必要があります。また、ヘッダーの「サイズ」フィールドが可変バイト数になる可能性がある場合、非同期バイトが挿入されるため、ヘッダー全体が可変バイト数になります。「ヘッダーのサイズは常に 10 バイトで、次のように見える... 」と言う方が簡単です。

ID3v2 ドキュメントによると、同期されていないデータのサイズは事前にわかりません。しかし、その発言には意味がありません。タグデータがバッファに格納されている場合、問題のある文字を $FF 00 に置き換えるだけで、非同期データのサイズを知ることができます。

あなたは正しいです、それは意味がありません。id3v2 ヘッダーとフレーム ヘッダーに記述されているサイズは、非同期が適用された場合のサイズです。ただし、id3v2 は mp3 以外のファイルのタグ付けに使用される可能性があるため、非同期/同期の概念が意味をなさないため、同期を解除せずにフレーム データを書き込むことができます。セクション6.2が言おうとしていたのは、「これmp3ファイルであるか、フレームが非同期/同期で書き込まれているかに関係なく、フレームサイズは常にmpeg同期セーフな方法で書き込まれる」.

ID3v2.4 フレームでは、フレーム ヘッダーに「Data Length Indicator」フラグを設定できます。この場合、同期後にバッファの大きさを確認できます。仕様のセクション 4.1.2 を参照してください。

私を助けてくれる人はいますか?

適合する id3v2 タグ リーダーを作成した人からの役立つアドバイス: 仕様を理解しようとしないでください。それは確かに狂人とサディストによって書かれました。もう一度見るだけで悪夢にうなされます。

于 2011-10-27T07:58:40.327 に答える