2013-06-18 17 views
6

Per riprodurre un file mp3, sto utilizzando la classe javafx.scene.media.MediaPlayer. Ma ho notato che currentTimeProperty non è affidabile dopo aver utilizzato il metodo seek().javaFX MediaPlayer getCurrentTime() inaffidabile

Il metodo initMediaPlayer() nel codice seguente viene chiamato quando l'utente ha scelto un file mp3. Il tempo di riproduzione viene visualizzato su un dispositivo di scorrimento temporale (=timeSlider) che l'utente può spostare per avviare la riproduzione da qualsiasi punto della canzone. La posizione corrente nella canzone viene anche visualizzata in un'etichetta (=timeLabel).

Quando avvio la riproduzione con play() e quando sospendo o riavvio il brano con pause() o stop(), tutto funziona correttamente.

Il problema è che dopo aver utilizzato seek() il currentTimeProperty non è più corretto. Questo diventa molto evidente verso la fine della canzone, quindi lo currentTimeProperty è a volte fino a 4 secondi più lungo del tempo totale della canzone.

Qual è la causa di questo problema e c'è un modo per aggirare il problema?

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

Hai un [SSCCE] (http://sscce.org/) che descrive il tuo problema? – ItachiUchiha

risposta

1

Volete ChangeListener<Duration>, non InvalidationListener.

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

Saresti in grado di fornire un po 'più di dettaglio alla tua risposta? – NT3RP

+1

@ NT3RP Ho aggiunto un esempio di codice. Sta solo aggiungendo l'ascoltatore sbagliato. Non sono sicuro di quali domande successive potrebbero esserci. :) – Xabster