我关注的ID3

ID3


ID3,一般是位于一个mp3文件的开头或末尾的若干字节内,附加了关于该mp3的歌手,标题,专辑名称,年代,风格等信息,该信息就被称为ID3信息,ID3信息分为两个版本,v1和v2版。 其中:v1版的ID3在mp3文件的末尾128字节,以TAG三个字符开头,后面跟上歌曲信息。 v2版一般位于mp3的开头,可以存储歌词,该专辑的图片等大容量的信息。

每个ID3V2.3的标签都一个标签头和若干个标签帧或一个扩展标签头组成

标签头
  在文件的首部顺序记录10个字节的ID3V2.3的头部。数据结构如下:
  char Header[3]; /*必须为"ID3"否则认为标签不存在*/
  char Ver; /*版本号;ID3V2.3就记录03,ID3V2.4就记录04*/
  char Revision; /*副版本号;此版本记录为00*/
  char Flag; /*存放标志的字节,这个版本只定义了三位,稍后详细解说*/
  char Size[4]; /*标签大小,包括标签帧和扩展标签头。(不包括标签头的10个字节)*/
  1.标志字节
  标志字节一般为0,定义如下:
  abc00000
  a -- 表示是否使用Unsynchronisation(这个单词不知道是什么意思,字典里也没有找到,一般不设置)
  b -- 表示是否有扩展头部,一般没有(至少Winamp没有记录),所以一般也不设置
  c -- 表示是否为测试标签(99.99%的标签都不是测试用的啦,所以一般也不设置)
  2.标签大小
  一共四个字节,但每个字节只用7位,最高位不使用恒为0。所以格式如下
  0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
  计算大小时要将0去掉,得到一个28位的二进制数,就是标签大小(不懂为什么要这样做),计算公式如下:
  int total_size;
  total_size = Size[0]*0x200000
  +Size[1]*0x4000
  +Size[2]*0x80
  +Size[3]


标签帧
  每个标签帧都有一个10个字节的帧头和至少一个字节的不固定长度的内容组成。它们也是顺序存放在文件中,和标签头和其他的标签帧也没有特殊的字符分隔。得到一个完整的帧的内容只有从帧头中得到内容大小后才能读出,读取时要注意大小,不要将其他帧的内容或帧头读入。
  帧头的定义如下:
  char FrameID[4]; /*用四个字符标识一个帧,说明其内容,稍后有常用的标识对照表*/
  char Size[4]; /*帧内容的大小,不包括帧头,不得小于1*/
  char Flags[2]; /*存放标志,只定义了6位,稍后详细解说*/
  1.帧标识
  用四个字符标识一个帧,说明一个帧的内容含义,常用的对照如下:
  TIT2=标题 表示内容为这首歌的标题,下同
  TPE1=作者
  TALB=专集
  TRCK=音轨 格式:N/M 其中N为专集中的第N首,M为专集中共M首,N和M为ASCII码表示的数字
  TYER=年代 是用ASCII码表示的数字
  TCON=类型 直接用字符串表示
  COMM=备注 格式:"eng/0备注内容",其中eng表示备注所使用的自然语言
  2.大小
  这个可没有标签头的算法那么麻烦,每个字节的8位全用,格式如下
  xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
  算法如下:
  int FSize;
  FSize = Size[0]*0x1000000
  +Size[1]*0x10000
  +Size[2]*0x100
  +Size[3];
  3.标志
  只定义了6位,另外的10位为0,但大部分的情况下16位都为0就可以了。格式如下:
  abc00000 ijk00000
  a -- 标签保护标志,设置时认为此帧作废
  b -- 文件保护标志,设置时认为此帧作废
  c -- 只读标志,设置时认为此帧不能修改(但我没有找到一个软件理会这个标志)
  i -- 压缩标志,设置时一个字节存放两个BCD码表示数字
  j -- 加密标志,(没有见过哪个MP3文件的标签用了加密)
  k -- 组标志,设置时说明此帧和其他的某帧是一组
  值得一提的是winamp在保存和读取帧内容的时候会在内容前面加个'/0',并把这个字节计算在帧内容的大小中。



ID3的读取:

mp3的id3信息存放在mp3文件结尾处的128字节处,结构如下:
  type ID3struct =packed record
  ID:array[0..2] of char
  title :array[0..29] of char;
  artist:array[0..29] of char;
  album:array[0..29} of char;
  year:array[0..3] of char;
  comment:array[0..29] of char;
  genre:byte;
  用指针读出相应位置的数据,就可以读出ID3信息:
  program showID3;
  {$apptype console}
  var
  tempfile:file of byte; //tempfile指针,二进制型文件
  i:integer;
  x:byte;
  begin
  assign(tempfile,'1.mp3');
  reset(tempfile);//文件关联,复位
  seek(tempfile,(filesize(tempfile)-128)); //指针指向距文件结尾128字节处
  writeln('ID:');
  for i:=0 to 2 do
  begin
  read(tempfile,x);
  write(chr(x));
  end;
  writeln;
  writeln('title:');
  for i:=0 to 29 do
  begin
  read(tempfile,x);
  write(chr(x));
  end;
  writeln;
  writeln('artist:');
  for i:=0 to 29 do
  begin
  read(tempfile,x);
  write(chr(x));
  end;
  writeln;
  writeln('album:');
  for i:=0 to 29 do
  begin
  read(tempfile,x);
  write(chr(x));
  end;
  writeln;
  writeln('year:');
  for i:=0 to 3 do
  begin
  read(tempfile,x);
  write(chr(x));
  end;
  writeln;
  writeln('comment:');
  for i:=0 to 29 do
  begin
  read(tempfile,x);
  write(chr(x));
  end;
  writeln; //用循环的方法依次读出各个字节
  close(tempfile);
  end.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值