用java获取mp3文件播放时长和tag信息

需要从mp3文件拿到mp3播放时长,折腾了几个小时,绕了弯路,大致记录一下。

先是找到mp3fenge这个分割mp3文件的开源项目 [url]http://code.google.com/p/mp3fenge/[/url]

发现用它的API得到trackLength对很多文件处理报错。在他的项目中看到jaudiotagger这个700多K的包,猜测其是解析mp3文件的主要处理库。但粗找了一下关于这个包的用法,没找到,于是找别的解析包。

一时间瞎试了好几个包 jlayer1.0.1.zip mp3spi1.9.5.zip jid3lib-0.5.4.zip 都有问题(走马观花的试用,多半是我用的有问题)。

用网上经典的那段代码


AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(file);
Map<?, ?> properties = fileFormat.properties();
Long ms = (Long) properties.get("duration");


一直报错。又看到很多帖子说是需要装 jmf,然后下载jmf-2_1_1e-alljava.zip安装还是报错。 最可恶是 oracle官网上说 jmf支持mp3格式,[url]http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140239.html[/url]

[quote]
MP3 support for JMF
We are excited to announce MP3 support for JMF! Please proceed to the download page to get your hands on this highly anticipated addition to JMF.
[/quote]

到下载页面 [url]http://www.oracle.com/technetwork/java/javase/download-137625.html[/url]

[quote]Unzip the JavaMP3plugin.zip in the JRE directory of your choice.
The included jar file (mp3plugin.jar) contains a Java Sound plugin as well as a Java Media Framework plugin for playing MPEG-2 Layer 3 Audio.[/quote]

进入download链接,竟然找不到 JavaMP3plugin.zip 的下载。

google了半天也没找到JavaMP3plugin的下载和资料,只要作罢。


最后,冷静下来,专心找 jaudiotagger 包的资料,找到项目主页[url]http://www.jthink.net/jaudiotagger/[/url]
下载 jaudiotagger-2.0.4-20111207.115108-15 这个版本
简单的几行代码


public static int getMp3TrackLength(File mp3File) {
try {
MP3File f = (MP3File)AudioFileIO.read(mp3File);
MP3AudioHeader audioHeader = (MP3AudioHeader)f.getAudioHeader();
return audioHeader.getTrackLength();
} catch(Exception e) {
return -1;
}
}


就搞定了!
原来不能解析的mp3文件测试都通过。也不用装什么JMF,只需要包含这一个包即可。

另外,jaudiotagger用的是jdk的logging,我还不会设置jdk log的全局级别(如有知道者请告知) 就使用了


AudioFileIO.logger.setLevel(Level.SEVERE);
ID3v23Frame.logger.setLevel(Level.SEVERE);
ID3v23Tag.logger.setLevel(Level.SEVERE);

这些代码来避免jaudiotagger输出很多log信息。


总结: 找资料先找官网,我开始就是想找 jaudiotagger 的中文资料,结果没找到合适的内容,然后瞎找了一堆项目。


给懒人用的测试代码
[code]
public static void test1() throws Exception {
File [] dirs = new File[] {
new File("F:/myvoices"),
new File("F:/music")
};

for(File dir : dirs) {
File [] fs = dir.listFiles();
for(File file : fs) {
int length = Mp3Util.getMp3TrackLength(file);
if(length <= 0) {
System.err.println("###出错" + file.getName() + "=" + Mp3Util.getMp3TrackLength(file));
} else {
System.out.println(file.getName() + "=" + Mp3Util.getMp3TrackLength(file));
}

}
}
}

[/code]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值