用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 都有問題(蜻蜓點水的試用,多半是我用的有問題)。

用網上經典的那段代碼
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

引用

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.



到下載頁面  http://www.oracle.com/technetwork/java/javase/download-137625.html
oracle

引用
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 這個版本
簡單的幾行代碼
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));
				}
				
			}
		}
	}
相關文章
相關標籤/搜索