2013-06-18 5 views
6

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

} 
+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