Aby odtworzyć plik mp3, używam klasy javafx.scene.media.MediaPlayer
. Ale zauważyłem, że currentTimeProperty nie jest wiarygodny po użyciu metody seek()
.javaFX MediaPlayer getCurrentTime() niewiarygodne
Metoda initMediaPlayer()
w poniższym kodzie jest wywoływana, gdy użytkownik wybrał plik mp3. Czas odtwarzania jest pokazany na suwaku czasu (=timeSlider
), który użytkownik może przesunąć, aby rozpocząć odtwarzanie z dowolnego miejsca w utworze. Aktualna pozycja w utworze jest również wyświetlana na etykiecie (=timeLabel
).
Po uruchomieniu odtwarzania z play()
, a po wstrzymaniu lub ponownym uruchomieniu utworu za pomocą pause()
lub stop()
wszystko działa poprawnie.
Problem polega na tym, że po użyciu seek()
nie jest już poprawne. Jest to bardzo widoczne pod koniec utworu, a następnie currentTimeProperty
jest czasem nawet o 4 sekundy dłuższy niż całkowity czas utworu.
Co jest przyczyną tego problemu i czy istnieje sposób obejścia tego problemu?
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));
}
});
}
Czy masz [SSCCE] (http://sscce.org/), który przedstawia twój problem? – ItachiUchiha