2013-06-18 13 views
6

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

} 
+0

Czy masz [SSCCE] (http://sscce.org/), który przedstawia twój problem? – ItachiUchiha

Odpowiedz

1

Chcesz ChangeListener<Duration> nie InvalidationListener.

audioPlayer.currentTimeProperty().addListener((observableValue, oldDuration, newDuration) -> { 
    System.out.println("Player:" + observableValue + " | Changed from playing at: " + oldDuration + " to play at " + newDuration); 
}); 
+0

Czy mógłbyś podać nieco więcej szczegółów swojej odpowiedzi? – NT3RP

+1

@ NT3RP Dodałem przykładowy fragment kodu. Dodaje tylko niewłaściwego słuchacza. Nie mam pewności, jakie dalsze pytania mogą być. :) – Xabster

Powiązane problemy