MP3ファイル形式は基本的にid3メタデータ+オーディオフレームの2つのセグメントで構成されていることを理解しています。すべてのid3セグメントとすべてのオーディオフレームを2つのバイナリブロブとしてバイナリ形式で読み取るにはどうすればよいですか?メタデータとオーディオをファイル内の2つの別々のユニットとしてハッシュ計算を実行することを単純に探しています。「分割点」がファイルのどこにあるかをどのように判断できますか?
2 に答える
ID3タグ仕様から:
+-----------------------------+
| Header (10 bytes) |
+-----------------------------+
| Extended Header |
| (variable length, OPTIONAL) |
+-----------------------------+
| Frames (variable length) |
+-----------------------------+
| Padding |
| (variable length, OPTIONAL) |
+-----------------------------+
| Footer (10 bytes, OPTIONAL) |
+-----------------------------+
そこにいくつかのID3タグバージョンがあることに注意してください。
通常、メタデータチャンクは0、1、または2つあります。
ファイルの先頭に、オプションのID3バージョン2メタデータチャンクが存在する場合があります。これは3つのサブバージョンで提供されます。このID3v2は常に可変長であり、ヘッダーにエンコードされますが、サブバージョンによってエンコードが少し異なります。
次に、オーディオフレームがあります。それらの数は可変です。ファイルのどこにいくつあるか、どこで終わるかを示すヘッダーはありません。
次に、ファイルの最後に、オプションのID3バージョン1 metadtaチャンクがあります。これは、128バイトの固定長で、3バイトの魔法の言葉で始まります。
まれに、ID3v2タグがファイルの最後または途中にある場合があります。
また、ID3v1タグに余分なものを追加して、タグを長くする可能性のあるまれな拡張機能があります。
MP3ファイル内のすべての「フレーム」を反復処理できます。各フレームは3バイトで始まり、フレームがID3v2「タグ」、MP3オーディオフレーム、またはID3v1タグのいずれであるかを判別するために使用できます。
オーディオフレームでエラーや破損が発生することはまれではないことに注意してください。これらのフレームは「同期」パターンと呼ばれる0xFFFFFFで始まり、フレーム内の他のバイトとビットを使用して、健全性チェックとフレームの長さの両方を計算する必要があります。
フレームが同期パターン、ID3タグの魔法の言葉で始まっていない場合、または健全性チェックに失敗した場合は、次の0xFFFFFF同期パターンが見つかるまでバイトを無視する必要があります。
そのため、ほとんどの場合に機能するショートカットを使用したり、ファイル全体を反復処理したりすることができますが、時間がかかる場合があります。また、私は実際には専門家ではないので、無知のために取り残されたものがある可能性があります。特に、メタデータに誤った同期パターンが埋め込まれていないことを確認するメカニズムはあると思いますが、それでも発生することがあると思います。
これがグーグル経由でここに来る新しい人々に役立つことを願っています(-: