須要從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)); } } } }