javaFX MediaPlayer getCurrentTime() 不可靠

标签 java media-player javafx

要播放 mp3 文件,我使用 javafx.scene.media.MediaPlayer 类。 但我注意到在使用 seek() 方法后 currentTimeProperty 不可靠。

下面代码中的方法 initMediaPlayer() 在用户选择了一个 mp3 文件时被调用。播放时间显示在时间 slider (=timeSlider) 中,用户可以移动该时间 slider 以从歌曲中的任意点开始播放。歌曲中的当前位置也显示在标签中 (=timeLabel)。

当我使用 play() 开始播放时,以及当我使用 pause()stop() 暂停或重新播放歌曲时,一切正常。

问题是在使用 seek() 之后,currentTimeProperty 不再正确。 这在歌曲快结束时变得非常明显,然后 currentTimeProperty 有时比歌曲的总时间长 4 秒。

此问题的原因是什么,是否有解决方法?

private void initMediaPlayer() {
    try {
        audio = new Media(audioFile.toURI().toURL().toString());
        audioPlayer = new MediaPlayer(audio);
    } catch (MalformedURLException ex) {
        Logger.getLogger(MainWindowController.class.getName())
            .log(Level.SEVERE, null, ex);
    }

    audioPlayer.currentTimeProperty().addListener(new InvalidationListener() {
        public void invalidated(Observable ov) {
            Duration time = audioPlayer.getCurrentTime();
            Duration total = audioPlayer.getTotalDuration();

            if (!timeSlider.isValueChanging() &&
                total.greaterThan(Duration.ZERO)){

                timeSlider.setValue(time.toMillis() / total.toMillis() * 100);
            }

            timeLabel.setText(formatTime(time,total));
        }
    });

    timeSlider.valueChangingProperty().addListener(new InvalidationListener() {
        public void invalidated(Observable ov) {
            audioPlayer.seek(audioPlayer.getTotalDuration()
                .multiply(timeSlider.getValue() / 100.0));
        }
    });

}

最佳答案

你想要ChangeListener<Duration> , 不是 InvalidationListener .

audioPlayer.currentTimeProperty().addListener((observableValue, oldDuration, newDuration) -> {
     System.out.println("Player:" + observableValue + " | Changed from playing at: " + oldDuration + " to play at " + newDuration);
});

关于javaFX MediaPlayer getCurrentTime() 不可靠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17165035/

相关文章:

java - JFrame 未正确加载

java - 25个类对象的数组

java - 两个双重嵌套的匿名内部类。如何获得一级匿名类(class)成员?

android - 检查音乐是否在 android 媒体播放器 API 中播放

android - setPlaybackParams 导致 IllegalStateException

java - 如何仅在其他规则被触发时才触发规则?

android - MediaPlayer 在第一次运行时不工作

从 jar 运行时无法加载 javafx 资源

JavaFX 如何在 GridPane 中的 HBox 中垂直对齐复选框

javafx - 如何打开两个Javafx窗口?