2013-06-18 56 views
6

要播放mp3文件,我正在使用javafx.scene.media.MediaPlayer類。 但我注意到使用seek()方法後,currentTimeProperty不可靠。javaFX MediaPlayer getCurrentTime()不可靠

下面的代碼中的方法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)); 
     } 
    }); 

} 
+0

您是否有[SSCCE](http://sscce.org/)描述您的問題? – ItachiUchiha

回答

1

你想ChangeListener<Duration>,不InvalidationListener

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

你能爲你的答案提供更多細節嗎? – NT3RP

+1

@ NT3RP我添加了一段代碼。他只是添加了錯誤的聽衆。我不確定哪些後續問題可能存在。 :) – Xabster