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

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

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

发现用它的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格式,http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140239.html

引用

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.

引用

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.

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

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

最后,冷静下来,专心找 jaudiotagger 包的资料,找到项目主页http://www.jthink.net/jaudiotagger/

下载 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 的中文资料,结果没找到合适的内容,然后瞎找了一堆项目。

给懒人用的测试代码

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));

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值