我是 Java 和 JavaFX 的新手,过去几年我一直在使用 QT 在 Python 上进行开发,现在我正在使用 Java 和 JavaFX 进行开发。
我正在开发一个程序,可以在用户设定的时间播放音乐文件,然后停止。因此,我需要从媒体对象获取持续时间,以便告诉音频何时停止(基于用户输入的时间),但是,媒体对象上的 getDuration() 方法总是返回未知。
我在 Windows 8.1 和 openSuSE 13.2(都有同样的问题)上使用 JDK8u25(最新的稳定版本):
File filestring = new File("my/file/dir/file.mp3")
Media file = new Media(filestring.toURI().toString());
file.getDuration(); // Returns UNKNOWN on both wav and mp3 files
file.getDuration().toMinutes()) // Also tested with toHours() toSeconds(), toMilli()...
// Above returns NaN because the file's duration is unknown
作为测试,我放入了我的整个 mp3 音乐 Collection (1,000 多首歌曲,同时包含 CBR 和 VBR)并让 java 遍历每个文件,所有文件都表示持续时间未知。我还尝试了来自多个不同来源的 wav 文件(只是为了确保它不是 mp3 格式),看看是否发生了变化……什么都没有;持续时间未知。我还检查以确保标签就位,每个其他程序都表示这些文件的文件属性中的长度或持续时间是好的。
奇怪的是,当我将 Media 对象传递给 MediaPlayer 时,该文件可以完美播放。虽然我可以使用外部库来获取长度,但鉴于整个程序使用 java 和 javafx 库,这会更容易和更流线型。
如有任何帮助,我们将不胜感激。
最佳答案
如果您阅读了 Media
类的 javadoc,它说您应该等待媒体播放器准备就绪:
The media information is obtained asynchronously and so not necessarily available immediately after instantiation of the class. All information should however be available if the instance has been associated with a MediaPlayer and that player has transitioned to Status.READY status
因此您只需要创建一个 MediaPlayer
实例并监听 Status.READY
:
File filestring = new File("my/file/dir/file.mp3");
Media file = new Media(filestring.toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(file);
mediaPlayer.setOnReady(new Runnable() {
@Override
public void run() {
System.out.println("Duration: "+file.getDuration().toSeconds());
// display media's metadata
for (Map.Entry<String, Object> entry : file.getMetadata().entrySet()){
System.out.println(entry.getKey() + ": " + entry.getValue());
}
// play if you want
mediaPlayer.play();
}
});
关于媒体对象上的 javafx 未知持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27208201/