我正在尝试读取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);
答案 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分钟内获得所有信息。