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 的指针,并且指针在您的系统中可能是 4 个字节。所以你在 fread()'ing 错误的大小和错误的方式。

我不知道 ID3 但标题中的某处必须是这个字符串的大小。

编辑:阅读文档

ID3v2 框架概述

由于标签由一个标签头和一个带有一个或多个帧的标签体组成,所有的帧都由一个帧头和一个或多个包含实际信息的字段组成。帧头的布局:

帧 ID $xx xx xx xx(四个字符)

尺码 $xx xx xx xx

标志 $xx xx

帧 ID 后跟一个大小描述符,使每帧的总标头大小为 10 个字节。大小计算为不包括帧头的帧大小(帧大小 - 10)。

你的框架结构是错误的。

修复 struct 并获得正确的 totalsize后,您可以fread() size-10使用字节来获取帧的内容。

请小心,因为您需要检查框架 ID 以查看它是否是标题的文件名框架,因为规范说它们可以按任何顺序排列。

请参阅文档。ID3v2 似乎有据可查。我能够在 5 分钟内获得所有这些信息。

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

于 2011-06-20T16:36:54.327 回答