须要从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 都有问题(蜻蜓点水的试用,多半是我用的有问题)。
用网上经典的那段代码
html
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
java
到下载页面 http://www.oracle.com/technetwork/java/javase/download-137625.html
oracle
进入download连接,居然找不到 JavaMP3plugin.zip 的下载。
google了半天也没找到JavaMP3plugin的下载和资料,只要做罢。
最后,冷静下来,专心找 jaudiotagger 包的资料,找到项目主页http://www.jthink.net/jaudiotagger/
下载 jaudiotagger-2.0.4-20111207.115108-15 这个版本
简单的几行代码
jsp
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 的中文资料,结果没找到合适的内容,而后瞎找了一堆项目。
给懒人用的测试代码this
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)); } } } }