要播放 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/