在Java开发中获取音乐文件的时间信息(如总时长、当前播放时间等)是一个常见需求,尤其在音乐播放器、音频处理工具等场景中,本文将详细介绍通过Java获取音乐时间信息的多种方法,涵盖标准库、第三方库以及不同音频格式的处理技巧。

使用Java标准库(Java Sound API)
Java Sound API是Java内置的音频处理工具,支持基本的音频操作,通过AudioFileFormat类可以解析音频文件的元数据,获取时长信息。
解析音频文件元数据
import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
public class AudioDuration {
public static void main(String[] args) {
try {
File file = new File("example.mp3");
AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(file);
Map<?, ?> properties = fileFormat.properties();
Long duration = (Long) properties.get("duration");
if (duration != null) {
double seconds = duration / 1_000_000.0;
System.out.printf("音频时长: %.2f 秒%n", seconds);
}
} catch (UnsupportedAudioFileException | IOException e) {
e.printStackTrace();
}
}
}
注意事项:
- Java Sound API对MP3等压缩格式的支持有限,可能无法正确解析所有文件的元数据。
- 对于未压缩格式(如WAV、AIFF),此方法通常更可靠。
使用第三方库(JAVE、JAudioTagger等)
当标准库无法满足需求时,第三方库提供了更强大的音频处理能力。
JAVE(Java Audio Video Encoder)
JAVE封装了FFmpeg,支持多种音频格式,能精确获取时长信息。
import it.sauronsoftware.jave.*;
public class JaveDuration {
public static void main(String[] args) {
try {
File source = new File("example.mp3");
AudioInfo info = Encoder.getInfo(source);
System.out.println("时长: " + info.getDuration() + " 毫秒");
} catch (Exception e) {
e.printStackTrace();
}
}
}
优点:
- 支持MP3、FLAC、AAC等主流格式。
- 除时长外,还可获取比特率、采样率等详细信息。
JAudioTagger
专注于音频元数据解析,轻量且高效。

import org.jaudiotagger.audio.AudioFile;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.tag.FieldKey;
public class JAudioTaggerDuration {
public static void main(String[] args) {
try {
AudioFile audioFile = AudioFileIO.read(new File("example.mp3"));
int length = audioFile.getAudioHeader().getTrackLength();
System.out.println("时长: " + length + " 秒");
} catch (Exception e) {
e.printStackTrace();
}
}
}
适用场景:
- 需要快速读取标签信息(如艺术家、专辑名)时。
- 对轻量级库有需求的项目。
实时获取播放时间(JavaFX或Swing)
在音乐播放器应用中,可能需要实时显示当前播放进度。
JavaFX Media API
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
public class PlayerTime {
public static void main(String[] args) {
String path = "example.mp3";
Media media = new Media(new File(path).toURI().toString());
MediaPlayer player = new MediaPlayer(media);
player.setOnReady(() -> {
System.out.println("总时长: " + player.getTotalDuration().toSeconds() + " 秒");
});
player.currentTimeProperty().addListener((obs, oldTime, newTime) -> {
System.out.println("当前时间: " + newTime.toSeconds() + " 秒");
});
player.play();
}
}
特点:
- 支持实时监听播放进度。
- 需要JavaFX环境(Java 8及以上版本内置)。
Swing + JLayer(MP3播放)
import javazoom.jl.player.Player;
public class JLayerTime {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("example.mp3")) {
Player player = new Player(fis);
System.out.println("开始播放,可通过线程跟踪时间");
player.play();
} catch (Exception e) {
e.printStackTrace();
}
}
}
补充说明:
- JLayer本身不直接提供时间回调,需结合线程或定时器实现进度跟踪。
处理不同音频格式的技巧
-
MP3文件:
- 优先使用JAVE或JAudioTagger,标准库可能解析失败。
- 注意ID3v2标签与音频数据的分离问题。
-
FLAC/AAC:

- JAVE支持较好,但需确保依赖的FFmpeg动态库正确配置。
- 可通过
ffmpeg -i file.flac命令验证文件可读性。
-
网络流媒体:
- 使用JavaFX的
Media类或第三方库(如TPlayer)处理HTTP/RTSP流。 - 需处理网络延迟和缓冲问题。
- 使用JavaFX的
性能优化与异常处理
- 避免重复解析:
缓存已解析的音频时长,减少IO操作。
- 异常处理:
- 捕获
UnsupportedAudioFileException处理不支持的格式。 - 检查文件权限和完整性,避免
IOException。
- 捕获
- 多线程安全:
音频解析和播放操作应在独立线程中执行,避免阻塞主线程。
获取Java音乐时间信息的方法多种多样,开发者需根据场景选择合适的技术:
- 简单场景:优先尝试Java Sound API。
- 多格式支持:使用JAVE或JAudioTagger。
- 实时播放:结合JavaFX或Swing实现进度跟踪。
- 高级需求:可考虑集成FFmpeg原生接口或使用TarsosDSP等专业音频库。
通过合理选择工具和优化代码结构,可以高效、准确地实现音乐时间信息的获取,为音频应用开发提供坚实基础。

















