最近自己写了一个获取ID3数据的函数,刚开始也是在网上找了大量的资料,众说纷纭,当时我也是被搞得有点晕了,所以现在结合他人的资料把我自己觉得应该注意的地方写下来。以便以后查看。
首先科普下mp3帧的知识:
MP3文件是由帧构成,帧是 MP3文件的最小组成单位。根据帧性质的不同,文件大体分为四个部分:ID3v2标签帧、数据帧、APEV2标签帧、ID3v1标签帧,而只有数据帧才是必需的。
数据帧包含了歌曲的压缩数据。标签帧提供了歌曲的演唱者、歌名、专辑、年份等信息。
ID3v1 在文件结尾,以字符串“TAG”为标识,其长度是固定的 128 个字节。
ID3V1结构
--------------------------------------------------------------------
名称 字节 说明
--------------------------------------------------------------------
Tag 3 ID3V1标识符“TAG”的Ascii码
Title 30 歌曲名
Artist 30 歌手名
Album 30 专辑名
Year 4 日期信息
Comment 28 注释信息,有时为30字节
Reserved 1 =0说明有音轨,下一字节就是音轨;≠0表示注释是30个字节
Track 1 音轨(字节型数值),歌曲在专辑里的序号
Genre 1 歌曲风格(字节型数值)
--------------------------------------------------------------------
备注:
1、歌曲的风格总共148种,具体信息可上网查阅。Genre是个usigned char,转换成数字之后即为该歌曲的风格编号,即可知道其歌曲风格的字符串。
2、V1版本没有指定具体的编码格式,不过可默认为GBK编码,一般来说不会错的。
3、如果MP3的注释=30字节,那么就要占用 Reserved 和 Track 两个字节,这要看 Reserved 是否=0,如果=0,那么注释有 28 个字节。如果不是,那么注释有 30 个字节。当注释=30 个字节的时候,那就没有 Track 了。
ID3V2 与 ID3V1 的作用差不多,也是记录 mp3 的有关信息,但 ID3V2 的结构比 ID3V1 要复杂得多,而且可以伸缩和扩展。ID3V2 到现在一共有 4 个版本,但流行的播放软件一般只支持第 3 版,既ID3V2.3。由于ID3V1记录在 MP3 文件的末尾,ID3V2 就只好记录在 MP3 文件的首部了。 每个 ID3V2.3 的标签都一个标签头和若干个标签帧或一个扩展标签头组成。歌曲的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。
一首MP3如果有ID3V2.3的话,那么ID3V2.3的标签头占用文件最前面的10个字节,其数据结构如下:
ID3V2.3标签头结构
--------------------------------------------------------------------
名称 字节 说明
--------------------------------------------------------------------
Header 3 ID3V2.3标识符"ID3"的Ascii码,否则认为没有ID3V2.3
Ver 1 版本号,=03
Revision 1 副版本号,=00
flag 1 标志字节,一般没意义,=00
Size 4 标签内容长度,高位在前,不包括标签头的10个字节
---------------------------------------------------------------------
备注:
1、Size:Size的计算公式如下:
使用位与 |:
size = ((Size[0] & 0x7f) << 21) |
((Size[1] & 0x7f) << 14) |
((Size[2] & 0x7f) << 7) |
(Size[3] & 0x7f);
或者使用加法+:
size = ((Size[0] & 0x7f) << 21) +
((Size[1] & 0x7f) << 14)+
((Size[2] & 0x7f) << 7)+
(Size[3] & 0x7f);
标签帧的结构
----------------------------------------------------------
名称 字节 说明
----------------------------------------------------------
FrameID 4 帧标识符的Ascii码,常用标识符的意义见下表
Size 4 帧内容及编码方式的合计长度,高位在前,不包括帧头的10个字节
Flags 2 标志,只使用了6位,一般均=0
帧内容 至少 1 个字节
----------------------------------------------------------
备注:
1、Size的计算同上。
2、编码方式一般在帧内容的第一个字节,可能取值为:
0x00:表示帧内容字符用 ISO-8859-1 编码;
0x01:表示帧内容字符用 UTF-16LE 编码;
0x02:表示帧内容字符用 UTF-16BE 编码;
0x03:表示帧内容字符用 UTF-8 编码(仅ID3V2.4才支持)
我在转码为UTF-8的时候,源编码格式用GBK代替ISO-8859-1,因为GBK英文部分与ISO-8859-1一致,同时是双字节编码,可以用来表示中文简体和繁体。而ISO-8859-1是单字节编码,自身不能显示中文。
另外编码方式为0x00时,转码后打印不出来信息(因为帧内容开头第一字节就是0x00),一般在判断编码格式之后去掉这一个字节,剩下的内容即可打印出来。
3、有时看到的是"eng"这样的字符形式,它表示帧内容所使用的自然语言为英语。
标签帧标识符的意义(FrameID)
---------------------------------------
名称 意义
---------------------------------------
AENC: 音频加密技术
APIC: 附加描述
COMM: 注释,相当于ID3v1的Comment
COMR: 广告
ENCR: 加密方法注册
ETC0: 事件时间编码
GEOB: 常规压缩对象
GRID: 组识别注册
IPLS: 复杂类别列表
MCDI: 音乐CD标识符
MLLT: MPEG位置查找表格
OWNE: 所有权
PRIV: 私有
PCNT: 播放计数
POPM: 普通仪表
POSS: 位置同步
RBUF: 推荐缓冲区大小
RVAD: 音量调节器
RVRB: 混响
SYLT: 同步歌词或文本
SYTC: 同步节拍编码
TALB: 专辑,相当于ID3v1的Album
TBPM: 每分钟节拍数
TCOM: 作曲家
TCON: 流派(风格),相当于ID3V1的Genre
TCOP: 版权
TDAT: 日期
TDLY: 播放列表返录
TENC: 编码
TEXT: 歌词作者
TFLT: 文件类型
TIME: 时间
TIT1: 内容组描述
TIT2: 标题,相当于ID3v1的Title
TIT3: 副标题
TKEY: 最初关键字
TLAN: 语言
TLEN: 长度
TMED: 媒体类型
TOAL: 原唱片集
TOFN: 原文件名
TOLY: 原歌词作者
TOPE: 原艺术家
TORY: 最初发行年份
TOWM: 文件所有者(许可证者)
TPE1: 艺术家相当于ID3v1的Artist
TPE2: 乐队
TPE3: 指挥者
TPE4: 翻译(记录员、修改员)
TPOS: 作品集部分
TPUB: 发行人
TRCK: 音轨(曲号),相当于ID3v1的Track
TRDA: 录制日期
TRSN: Intenet电台名称
TRSO: Intenet电台所有者
TSIZ: 大小
TSRC: ISRC(国际的标准记录代码)
TSSE: 编码使用的软件(硬件设置)
TYER: 年代,相当于ID3v1的Year
TXXX: 年度
UFID: 唯一的文件标识符
USER: 使用条款
USLT: 歌词
WCOM: 广告信息
WCOP: 版权信息
WOAF: 官方音频文件网页
WOAR: 官方艺术家网页
WOAS: 官方音频原始资料网页
WORS: 官方互联网无线配置首页
WPAY: 付款
WPUB: 出版商官方网页
WXXX: 用户定义的URL链接
---------------------------------------
说明:
①帧内容是数字的,都用 Ascii 字符表示。
②有的 TCON(风格、流派)的帧内容是直接用字符串表示的,如“genre”,而有的则是用编号表示的,如“28 31 32 29”就是用字符串“(12)”表示 12 号风格,我们在解析的时候要注意。
③TRCK(音轨)的帧内容格式是:N/M。其中,分母表示专辑中共有 M 首歌曲,分子表示专辑中的第 N 首曲。