我正在尝试阅读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);发布于 2011-06-21 00:36:54
我知道有些地方不对劲,因为sizeof(struct ID3V2frame)会返回:
sizeof(char[4]) + sizeof(char pointer) + sizeof(int[4])请注意,该结构有一个指向字符的指针,并且在系统中指针可能是4个字节。所以你的fread()大小和方式都是错误的。
我不知道ID3,但是在头部的某个地方一定是这个字符串的大小。
编辑:阅读文档
ID3v2框架概述
由于标签由具有一个或多个帧的标签报头和标签主体组成,因此所有帧都由帧报头组成,后面跟着一个或多个包含实际信息的字段。帧头的布局:
帧ID $xx (四个字符)
大小为$xx xx
标志$xx xx
帧ID后面跟着一个大小描述符,使得每个帧中的总报头大小为10字节。大小计算为帧大小(不包括帧头)(帧大小- 10)。
您的框架结构错误。
在你修复了你的结构并且有了合适的总字节之后,你可以fread() size-10字节来获取帧的内容。
请小心,因为您需要检查Frame ID以查看它是否是标题的文件名frame,因为规范中说它们可以按任何顺序排列。
请参考文档。ID3v2似乎有很好的文档记录。我能够在5分钟内得到所有的信息。
http://www.id3.org/id3v2.3.0
https://stackoverflow.com/questions/6414050
复制相似问题