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));
}
});
}