需要从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]