读取MP3头文件信息

cql0007 2007-04-11 09:52:26
现在在弄个读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大小)并没有跳出标签头

谢谢!
...全文
1465 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cql0007 2007-06-15
  • 打赏
  • 举报
回复
多谢各位老兄了。
xiaomantoubaba 2007-05-14
  • 打赏
  • 举报
回复
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
vbuilderv 2007-05-10
  • 打赏
  • 举报
回复
http://developer.kde.org/~wheeler/taglib.html
vbuilderv 2007-05-10
  • 打赏
  • 举报
回复
http://id3lib.sourceforge.net/
cql0007 2007-04-16
  • 打赏
  • 举报
回复
谢谢jiangsheng(蒋晟.Net[MVP]) 老兄提供这个类,我先研究研究先了。
oo 2007-04-12
  • 打赏
  • 举报
回复
mark
蒋晟 2007-04-12
  • 打赏
  • 举报
回复
http://javamusictag.sourceforge.net/
最近学了一些游戏开发必不可少的MP3文件播放知识。首先,我的目标机器是windows,所以这些是在windows平台下开发的。随后我学到,要直接解码MP3文件是非常的困难的。因为MP3文件的闭源,我们都没有知道怎样才能一个一个地解码。好在DirectShow帮我们解决了解码的工作,我们需要的只是加入头文件,并且手动链接库文件,使用它的函数就行了。 为了使用它的函数,我们必须加入头文件dshow.h。这个头文件是不容易找到的。以后的DirectX里面都没有了DirectShow的踪影。我只好下载2004年十二月的DirectX版本,这个版本里就有dshow.h。好了,我们加入这个头文件不外乎就是要加一些接口。这里我列举这一些接口的名字: IGraphBuilder IMediaControl IMediaEventEx 为了能够解析IGraphBuilder这个符号,我们还要手动地链接Strmiids.lib库。这个库不是特别的显眼,但是没有它我们的程序就无法通过。 好了,准备工作做好了后,我们开始写一个类了。这个类很简单,叫CMP3。这个类里面嵌入了另外一个MP3标签类CMP3Tag。下面就是我这个类的代码。 class CMP3 { public: CMP3( void ) // 默认构造函数 { m_GraphBuilder = NULL; m_MediaControl = NULL; m_MediaEventEx = NULL; m_IsPlaying = false; } ~CMP3( void ); // 析构函数 bool LoadMP3File( TString strFilename ); // 读取MP3文件 bool Play( void ); // 播放MP3文件 void ProcessNotification( void ); // 处理通知 CMP3Tag GetMP3Tag( void ) { return m_tag; } // 获取MP3标签 bool IsPlaying( void ) { return m_IsPlaying; } // 判断是否正在播放 private: bool m_IsPlaying; IGraphBuilder* m_GraphBuilder; IMediaControl* m_MediaControl; IMediaEventEx* m_MediaEventEx; CMP3Tag m_tag; };

2,554

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧