当前位置: 代码迷 >> 多媒体/流媒体开发 >> 读取MP3头文件信息解决方案
  详细解决方案

读取MP3头文件信息解决方案

热度:9201   发布时间:2013-02-26 00:00:00.0
读取MP3头文件信息
现在在弄个读MP3文件信息的东东,包括读取作者、持续时间等。最主要是持续时间。在弄文件头的时候遇到问题了,有两种情况:
1、ID3V1格式的

这种格式的属性信息放在最后的128个字节中,读最后的字节即可以读到相关的属性,持续时间不在最后的TAG里面,要从前面的帖头信息里去读。现在在读文件最尾的128个字节时出现这个问题:因为我读的文件是个网络流,象别的文件如SWF、RM都是在文件头里面,只需要读取前面几个或者几十个字节就可以知道这些属性了,但MP3文件的ID3V1版是放在文件尾的,我需要将整个文件读完才能读出后面的信息吗?我是用JAVA来做的,网络流没办法直接跳到后面去。

2、ID3V2格式的
这种格式的属性信息全部放在头件头里在文件的前面。但我在读ID3V2的标签头时遇到看不懂的地方了。我不知道怎么读完前面的标签头,跳到帧头去读持续时间那些信息?网上的文档这里的格式说明为:

2.标签大小
  一共四个字节,但每个字节只用7位,最高位不使用恒为0。所以格式如下
  0xxxxxxx   0xxxxxxx   0xxxxxxx   0xxxxxxx
  计算大小时要将0去掉,得到一个28位的二进制数,就是标签大小(不懂为什么要这样做),计算公式如下:
  int   total_size;
  total_size   =       (Size[0]&0x7F)*0x200000
      +(Size[1]&0x7F)*0x400
      +(Size[2]&0x7F)*0x80
      +(Size[3]&0x7F)
这里我没看懂,照着这个去弄,跳出这段(size大小)并没有跳出标签头

谢谢!

------解决方案--------------------------------------------------------
http://javamusictag.sourceforge.net/
------解决方案--------------------------------------------------------
http://id3lib.sourceforge.net/
------解决方案--------------------------------------------------------
http://developer.kde.org/~wheeler/taglib
------解决方案--------------------------------------------------------
fseek(fp, total_size+10, SEEK_SET);
total_size不包括扩展头的。 所以你需要再前进10个byte


// ------------------- MP3的结构是这样的 ---------------------------
ID3V2Header

ID3V2FrameHeader--ID3V2FrameContent ID3V2FrameHeader--ID3V2FrameContent ... (ID3V2Frame结构是用来存储 标题, 年份, 专辑 ....)

ExtendHeader (10byte的扩展标签头)

FrameHeader-CRC-SideInfo-MAINDATA FrameHeader-CRC-SideInfo-MAINDATA ... (音框)

ID3V1
  相关解决方案