0

id3 フレームを読み取ろうとしていますが、完全なタイトルを取得できないという問題があります。mp3 のタイトルが長い場合、結果は末尾がなく、最初の 9 文字がない文字列になります。曲のタイトルが短い場合、結果は最初の 9 文字のないタイトルになります。

struct ID3V2frame
{
    char header[4];
    char *id3frame[readBytes];
    int sizze[4];
}frame;

fseek(file,10,SEEK_SET); // skip id3 header

fread(&frame.header,sizeof(frame),1,file);


readBytes = ((frame.sizze[0] & 127) << 21) |
((frame.sizze[1] & 127) << 14) |
((frame.sizze[2] & 127) << 7)  |
(frame.sizze[3] & 127); 

fread(&frame.id3frame,sizeof(frame),1,file);
if(strncmp(frame.header,"TIT2", 4) == 0)
    printf("%s",frame.id3frame);
4

1 に答える 1

0

sizeof(struct ID3V2frame)が返されるため、何か問題があることはわかっています。

sizeof(char[4]) + sizeof(char pointer) + sizeof(int[4])

構造体には char への POINTER があり、ポインターはシステムではおそらく 4 バイトであることに注意してください。したがって、間違ったサイズと間違った方法で fread() を実行しています。

ID3 についてはわかりませんが、ヘッダーのどこかにこの文字列のサイズが必要です。

編集:ドキュメントを読む

ID3v2 フレームの概要

タグは、タグ ヘッダーと 1 つ以上のフレームを含むタグ ボディで構成されるため、すべてのフレームは、実際の情報を含む 1 つ以上のフィールドが後に続くフレーム ヘッダーで構成されます。フレームヘッダーのレイアウト:

フレーム ID $xx xx xx xx (4 文字)

サイズ $xx xx xx xx

フラグ $xx xx

フレーム ID の後にサイズ記述子が続き、各フレームの合計ヘッダー サイズは 10 バイトになります。サイズは、フレームヘッダーを除いたフレームサイズ(フレームサイズ-10)として計算されます。

フレーム構造が間違っています。

構造体を修正して適切な totalを取得したら、bytes でフレームの内容を取得sizeできます。fread() size-10

フレームIDをチェックして、タイトルのファイル名フレームかどうかを確認する必要があるため、注意してください。仕様では、順序は任意であると規定されています。

ドキュメントを参照してください。ID3v2 はよく文書化されているようです。5分ですべての情報を取得できました。

http://www.id3.org/id3v2.3.0

于 2011-06-20T16:36:54.327 に答える