JavaFX MediaPlayer 高度不准确的搜索

Posted

技术标签:

【中文标题】JavaFX MediaPlayer 高度不准确的搜索【英文标题】:JavaFX MediaPlayer highly inaccurate seeking 【发布时间】:2015-09-05 08:48:25 【问题描述】:

我正在使用 320 kbps 大约 1 小时长的 MP3 文件。我正在进行的项目将在 MP3 文件中寻找音乐集合,以便它可以随机播放歌曲。我会给程序提供时间戳,它会寻找歌曲。如果 JavaFX 的 seek 方法不是很不准确,它会起作用。

使用MediaPlayer.seek(duration) The MediaPlayer.getCurrentTime() 后,我们按预期返回了我们寻求的持续时间。但是,如果我们收听 mp3 文件(无需搜索或在外部 mp3 播放器中),我们就会意识到报告的时间和实际情况大不相同,有时甚至是几秒钟。

例如MediaPlayer.seek(Duration.millis(2000)) 搜索结果为 0 秒。 2 秒的故障率是不可接受的。

使用 WAV 似乎可以工作。虽然它没有 MP3。

到目前为止,我认为两种解决方法都是可行的:

编写没有错误的 MP3 解码器和播放器 使用未压缩的 WAV 文件

有没有人知道的更好?

如果有人需要源代码,里面没有更多内容:

public static void main(String[] args) 
        MediaPlayer player = null;
        JFXPanel fxPanel = new JFXPanel(); //To initialize JavaFX
        try 
            String url = new File("E:\\Music\\test.mp3").toURI().toURL().toExternalForm();
            player = new MediaPlayer(new Media(url));
            System.out.println("File loaded!");
         catch (MalformedURLException e) 
            //e.printStackTrace();
            System.out.println("Error with filename!");
            System.exit(0);
        

        player.play();

        System.out.println("Playing!");

        while (true)
        
            Scanner reader = new Scanner(System.in);
            String string = reader.nextLine();
            if (string.equals("Exit")) System.exit(0);
            else if (string.equals("Seek"))
            
                player.seek(Duration.millis(2000)); //this seeks to the beggining of the file
                player.pause();
                try 
                    Thread.sleep(100); //player.getCurrentTime() doesn't update immediately
                 catch (InterruptedException e)  
                System.out.println("Time: " + player.getCurrentTime().toMillis() + " / " + player.getTotalDuration().toMillis());
                player.play();
            
        
    

【问题讨论】:

JavaFX does not support OGG,所以我不确定你为什么在你的问题中引用它。 JavaFX 是为用户应用程序代码维护一个single-threaded programming model,您可能应该重写您的测试程序以确保对 JavaFX 媒体系统的所有 API 调用(读取或写入)都在 JavaFX 应用程序上执行线程(请参阅Platform.runLater() 或仅使用Application)。这样做时,请注意不要停止或休眠 JavaFX 应用程序线程。 【参考方案1】:

我会推荐使用 javazoom 库。它是一个开源 java 库,已经编写了没有错误的东西(至少我没有找到)。

来源 http://www.javazoom.net/index.shtml

【讨论】:

【参考方案2】:

从 UI 线程中调用 seek 方法,否则 UI 将挂起。

new Thread(() ->player.seek(Duration.millis(2000))).start();

【讨论】:

以上是关于JavaFX MediaPlayer 高度不准确的搜索的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX:MediaPlayer 无法播放电影

使用 JavaFX MediaPlayer 从 MP3 读取 ID3v2 标签

JavaFX - 使 TableView 高度适应行数

在javafx中设置舞台和场景的高度和宽度

JavaFX 标签高度

fedora 21 javafx 没有创建媒体播放器