ID3V2

ID3V2


ID3V2 到现在一共有4个版本{ID3V2.1,ID3V2.2 ID3V2.3 ID3V2.4},最流行的为
第3版,即 ID3V2.3 ,由于ID3V1记录在文件末尾,ID3V2一般记录在文件头,据闻ID3V2.4也可以记录在文件末尾。
ID3V2特点:可伸缩可扩展, 支持多编码 ,结构复杂,操作速度较慢。
ID3V2 存储格式: 标签头【10字节】&& 若干标签帧 ||扩展标签头【10字节】
现在看结构信息:


1,标签头
     一般在文件首部记录10个字节的ID3V2头部【ID3V2.4也可能记录在其他地方】
    标签头必须是 "ID3",否则认为标签不存在;
    机构如下:
      char Header[3];      /*必须为 "ID3" 否则认为标签不存在*/
      char Ver;            /*ID3V2版本号,ID3V2.3 就记录3*/
      char Revision:       /*副版本号,一般为0*/
      char Flag;           /*存放标志字节,一般全部为0*/
      char Size[4];        /*所有标签大小, 不包括标签头的10个字节 */
     
    1》版本 Ver;
       用二进制方式存储ID3V2版本号:
       目前常见的有: 2,3,4对应 ID3V2.2 ID3V2.3 ID3V2.4,
       ID3V2.1 没见到过,也未查到资料,请熟悉的朋友发份邮件给我;
      
    2》Flag: 标志 定义如下:
       abcd0000
       
       a -- 表示是否使用 Unsynchronisation <一般为0-128,代表是否已经同步,这个标志主要为以前版本准备的,新的实现可以忽略这个标志,ID3V2.4一般为 128,ID3V2.3 多为 0>;
       
       b -- 表示是否有扩展头部,格式为:
            扩展头大小 4 个字节
            扩展标志 2个字节
            填充     4个字节
            一般没有扩展标签头【b=0】
       c -- 表示是否为测试标签,默认为0,不用设置
       d -- 表示ID3V2最后是否含有Footer.
       最后4位不使用


    3》Size[4]: ID3V2所有标签大小,不包含 10字节的标签头;
       一个4个字节,但每个字节只用7位,最高位不使用为0,格式如下:
       0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
       计算大小时要将0去掉,得到一个28位的二进制数,就是标签大小,计算公式如下:
       int total_size;
       total_size = ((Size[0] & 0x7f)<<21)+((Size[1] & 0x7f)<<14)+((Size[2] & 0x7f)<<7)+(Size[3] & 0x7f) 
   
2, 扩展头
       扩展头包含了更多的数据信息,是对ID3V2的补充,但是并非解析MP3文件的关键数据,是否有扩展头,对应于ID3V2 Flag.


3, ID3V2 标签帧
       每个ID3V2标签含有一个或多个ID3V2帧,每个帧有ID3V2帧头和帧体构成:例如;
       FrameID[4]+FrameSize[4]+Flags[2]+FrameCont_encode+FrameCont;
       ID3V2.4和ID3V2.3帧体结构:
       
       FrameID[4]            /*四个字节的帧ID,比如TIT2(mp3歌曲名),TPE1(歌手名)等*/
       FrameSize[4]          /*帧体大小,4个字节都可以使用,共计32位,注:不包含帧ID大小,包含帧体字符编码一个字节加帧体内容, Big Endian */
       Flags[2]              /*帧体填充,2个字节,一般不设置,用\0填充*/
        FrameCont_encode      /*帧体字符所用编码*/    
       FrameCont             /*帧体部分,字节长度为FrameSize[4] = FrameCont_encode.length+FrameCont.length*/
       
       注:FrameSize[4],Flags[2],FrameCont_encode,都为二进制格式存储,为明确指明的为原字符存储;
        FrameCont_encode 有4个值;
       0000 0000 代表帧体用 ISO-8859-1 编码方式存储;
       0000 0001 代表帧体用 UTF-16LE   编码方式存储;
       0000 0010 代表帧体用 UTF-16BE   编码方式存储;
       0000 0011 代表帧体用 UTF-8      编码方式存储;[只用ID3V2.4才支持UTF-8编码方式]
    4,ID3V2 尾:
       ID3V2 尾(Footer)是可选的,有时候可能需要从MP3文件的尾部向前搜索ID3V2的位置,这时候ID3V2的存在就可以
       加快搜索的速度,ID3V2尾和ID3V2头的内容是一致的,只是文件头标示部分由 "ID3" 改成了 "3DI";
     
    下面附上一些 FrameID帧标: 用4个字符标示一个帧的内容,常用对照如下:
    
     TCOP: 版权         TOPE: 原艺术家
     TDAT: 日期         TPE3: 指挥者
     TPE1: 艺术家       TYER: 专辑发行年代
     USLT: 歌词         TALB: 专辑名称
     TIT2: 歌曲名称     TCON: 流派
     COMM: 注释         TRCK: 音轨号/综合音轨号
    5, ID3V2.2
       因ID3V2.2有些特殊,在此做下介绍:
       ID3V2.2的帧标签与ID3V2.3 ID3V2.4 有些差异,结构如下:
       
       char FrameID[3];        /*用三个字符标示一个帧ID,比如 TT2(歌曲名),TP1(艺术家)*/
       char Size[3];           /*帧体内容大小,不包含帧ID,不到小于1*/
       char FrameCont_encode   /*帧体字符所用编码*/
       char FrameCont          /*帧体字符*/
       
       注: 注意它没有填充:
       常用帧标示:
       TT2:   标题               TP1:     艺术家
       TAL:   专辑名             TRK:     音轨号/合计音轨
       TYE:   发行日期           COM:     注释
       TEN:   编码方式           TCO:     流派
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值