我如何读取id3v2的帧?

时间:2011-06-20 15:57:27

标签: c mp3 id3v2

我正在尝试读取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);

1 个答案:

答案 0 :(得分:0)

我知道有问题,因为sizeof(struct ID3V2frame)会返回:

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

注意,struct有一个char的POINTER,并且指针在你的系统中可能是4个字节。所以你是错误的大小和错误的方式。(/ p>)

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

编辑:阅读文档

  

ID3v2框架概述

     

由于标签由标签标题组成   和一个标签主体有一个或多个   帧,所有帧由一个   帧标题后跟一个或多个   包含实际的字段   信息。框架的布局   头:

     

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

     

尺寸$ xx xx xx xx

     

标志$ xx xx

     

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

你的框架结构是错误的。

修复结构并具有正确的总size后,您可以fread() size-10个字节来获取框架的内容。

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

请参阅文档。 ID3v2似乎记录良好。我能在5分钟内获得所有信息。

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