【发布时间】:2013-06-18 09:17:07
【问题描述】:
要播放 mp3 文件,我使用的是 javafx.scene.media.MediaPlayer 类。
但是我注意到使用seek()方法后currentTimeProperty是不可靠的。
当用户选择了一个mp3文件时,下面代码中的initMediaPlayer()方法会被调用。播放时间显示在时间滑块 (=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));
}
});
}
【问题讨论】:
-
您有描述您的问题的SSCCE 吗?
标签: java media-player javafx