Sam*_*yer 6 java javafx media-player
要播放mp3文件,我正在使用该javafx.scene.media.MediaPlayer课程.但我注意到使用该seek()方法后currentTimeProperty不可靠.
initMediaPlayer()当用户选择mp3文件时,将调用下面代码中的方法.播放时间显示在时间滑块(=timeSlider)中,用户可以从该滑块中移动以从歌曲中的任何一点开始播放.歌曲中的当前位置也显示在标签(=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));
}
});
}
Run Code Online (Sandbox Code Playgroud)
你想要ChangeListener<Duration>,没有InvalidationListener。
audioPlayer.currentTimeProperty().addListener((observableValue, oldDuration, newDuration) -> {
System.out.println("Player:" + observableValue + " | Changed from playing at: " + oldDuration + " to play at " + newDuration);
});
Run Code Online (Sandbox Code Playgroud)