需要从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));
}
}
}
}
分享到:
相关推荐
本文将深入探讨如何使用Java解析这些信息,特别是获取MP3文件的时长,并将其格式化为“00:04:20”这样的形式。 首先,我们需要了解ID3标签的结构。ID3v2是当前最常用的版本,它包含多个帧,每个帧都有特定的标识符...
总的来说,这个压缩包提供了解决Java环境下获取.mp3和.wav格式音频文件时长的工具。通过JaudioTagger和jl1.0.1.jar,开发者可以方便地集成到自己的项目中,实现音频时长的快速获取。在开发过程中,需要注意版权问题...
2. **文件I/O**:读取MP3文件信息,如歌曲名、艺术家、时长等,可能需要使用特定的库,如ID3标签解析库(如`libid3tag`)来获取元数据。 3. **音频解码**:为了播放MP3文件,程序需要解码音频数据。这通常需要使用...
`jid3lib`是一个专门用于处理ID3标签的开源库,ID3是MP3文件中的一个标准元数据格式,用来存储歌曲的信息,如艺术家、专辑、标题、时长等。`jid3lib-0.5.4`是这个库的一个版本,它支持ID3v1和ID3v2两种版本的标签,...
这需要对音频处理有一定的理解,例如使用Java的AudioSystem类或者第三方库如JLayer或JMF(Java Media Framework)来加载、解码和播放音频文件。 3. **文件操作**:播放器需要能够读取和管理音乐文件,可能涉及文件I...
音乐:歌手名+歌曲名等元信息,以MP3文件大体分为三部分: a) TAG_V2(ID3V2) 包含了作者、作曲、专辑等信息,长度不固定,扩充ID3V1信息 b) Frame 一系列的帧,由帧头(MP3的位率、采样率、版本等信息)和数据实体...
当我们需要从SWF文件中单独提取声音文件时,这就涉及到编程技术。本文将详细介绍如何通过编程来实现这一目标。 首先,我们需要理解SWF文件的结构。SWF文件是二进制文件,其中包含了各种数据块,如图形、动作脚本和...
6. **元数据解析**:音乐文件通常包含元数据,如艺术家名、专辑名和歌曲时长等。ABC音乐播放器可能使用了Java的ID3Tag库来解析这些信息,以便在界面上展示。 7. **线程处理**:为了保证用户界面的流畅性,播放过程...
- `getDuration(String path)`: 此方法用于获取指定路径下的媒体文件时长。通过创建一个新的MediaPlayer实例来获取媒体时长,获取完毕后关闭该实例。 ```java public void play(FileInputStream inputStream) { ...
的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...
- `ping`:发送PING请求时使用的URL列表。 - `rel`:定义与被链接文档的关系。 - `target`:定义在何处打开链接。 - `type`:定义链接文档的MIME类型。 - **示例**: ```html ...