媒体对象上的 javafx 未知持续时间

标签 java audio javafx media

我是 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/

相关文章:

java - 为什么ArrayList.add()在java中将值添加到定义为a = b的多个数组列表中?

android.graphics.BitmapFactory.nativeDecodeAsset( native 方法)中的 java.lang.OutOfMemoryError

C# FMOD 从流中播放

javascript - 在 Lollipop chrome 中通过 JS 播放本地 mp3 文件

JavaFX 8 Pagination 将页码放在顶部

javafx - 将旋转的 ImageView 适配到应用程序窗口/场景中

java - 用同步块(synchronized block)替换 volatile 不起作用

java - 我可以对函数 CURSOR 结果使用命名参数吗?

javascript - (JS/HTML) 如何从本地目录中提取 MP3 并将其分配给音频元素?

java - 如何仅在 TreeTableView 中按叶子排序?