用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));
				}
				
			}
		}
	}
相关文章
相关标签/搜索