当前位置: 首页 > 面试题库 >

Mediaf对象上的javafx UNKNOWN持续时间

全丰
2023-03-14
问题内容

我是Java和JavaFX的新手,最近几年我一直在使用QT在Python上进行开发,现在我正在使用Java和JavaFX进行开发。

我正在开发一个程序,该程序可以为用户设置时间播放音乐文件,然后停止播放。因此,我需要从媒体对象获取持续时间以告诉音频何时停止(基于用户输入的时间),但是,媒体对象上的getDuration()方法始终返回UNKNOWN。

我在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音乐收藏(1,000多个带有CBR和VBR的歌曲),并对每个文件进行Java迭代,所有这些都说持续时间是未知的。我还尝试了来自多个不同来源的wav文件(只是为了确保它不是mp3格式),以查看该文件是否已更改并且没有任何变化。没有什么,但持续时间未知。我还检查以确保标签在适当的位置,每个其他程序都说这些文件的文件属性中的长度或持续时间很好。

奇怪的是,当我将Media对象传递给MediaPlayer时,该文件可以完美播放。尽管我可以使用外部库来获取长度,但是由于整个程序都使用java和javafx库,所以这样做会更容易且更简化。

任何帮助将不胜感激。


问题答案:

如果您阅读Media类的Javadoc ,它说您应该等待媒体播放器准备就绪:

媒体信息是异步获取的,因此不一定在类实例化后立即可用。但是,如果实例已与MediaPlayer关联并且该播放器已转换为Status.READY状态,则所有信息都应该可用。

因此,您只需要创建一个实例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();
        }
    });


 类似资料:
  • 我是Java和JavaFX的新手,过去几年我一直在用QT开发Python,现在我正在用Java和JavaFX开发。 我正在开发一个程序,为用户播放音乐文件设定时间,然后停止。因此,我需要从媒体对象获取持续时间,以便告诉音频何时停止(基于用户的时间输入),但是,媒体对象上的getDuration()方法总是返回UNKNOWN。 我在Windows 8.1和openSuSE 13.2上使用JDK8u2

  • 在PowerShell中,有没有办法将ISO 8601指定的持续时间转换成DateTime对象?例如,PT30M是30分钟前,因此如果现在的时间是< code>2019-07-31 17:00:00,我希望时间戳为< code>2019-07-31 16:30:00。 我尝试过显而易见的 - 但这(毫不奇怪地失败了) Get Date:输入对象不能绑定到命令的任何参数,因为命令不接受管道输入,或者

  • 问题内容: 我需要一个Python / C / C ++ / Java实现,可以 暂停散列进步 和 商店 ,在这样一个文件进度的进展是 可恢复 从该文件在稍后阶段。 无论上面列出的是哪种语言编写的,它都应该可以在Python中正常工作。建议您提供它以便与“ hashlib”一起良好地工作,但这不是必需的。同样,如果已经存在这样的事物,那么到此的链接就足够了。 对于一个想法 ,您的实现应该实现什么。

  • > 自动对象t何时会被销毁? 它会被编译器安全地销毁吗? 为什么是未定义的行为?

  • 问题内容: 如何获取格式为2个字符串的持续时间? 我正在尝试使用Calendar类并检查。我与此有关的问题是它不一致。知道我在做什么错吗?每次我运行该程序时,如果没有,输出40-70行到控制台。 问题答案: 那是一个已记录的错误。 尝试在设置日历之前清除日历:

  • 许多记者将显示测试持续时间,以及标记缓慢的测试,如“spec”记者所示: 要调整被认为“慢”的东西,您可以使用以下slow()方法: describe('something slow', function() { this.slow(10000); it('should take long enough for me to go make a sandwich', function() { /