mp3ファイルを再生するには、javafx.scene.media.MediaPlayer
クラスを使用しています。 しかし、私は、seek()
メソッドを使用した後、currentTimePropertyが信頼できないことに気付きました。javaFX MediaPlayer getCurrentTime()unreliable
以下のコードの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));
}
});
}
あなたの問題を示す[SSCCE](http://sscce.org/)がありますか? – ItachiUchiha