用java获取mp3文件播放时长和tag信息

只愿长相守 提交于 2019-12-01 12:21:10

需要从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 都有问题(走马观花的试用,多半是我用的有问题)。

用网上经典的那段代码

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

引用

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

引用
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 这个版本
简单的几行代码

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 的中文资料,结果没找到合适的内容,然后瞎找了一堆项目。


给懒人用的测试代码

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));
				}
				
			}
		}
	}





易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!