首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何读取id3v2的帧?

如何读取id3v2的帧?
EN

Stack Overflow用户
提问于 2011-06-20 23:57:27
回答 1查看 2.3K关注 0票数 0

我正在尝试阅读id3框架,但我的问题是我无法获得完整的标题。当mp3的标题很长时,我的结果是没有结尾和前9个字符的字符串。如果歌曲的标题很短,我的结果是标题没有前9个字符。

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-21 00:36:54

我知道有些地方不对劲,因为sizeof(struct ID3V2frame)会返回:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6414050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档