6

mp3 ファイルを再生するには、javafx.scene.media.MediaPlayerクラスを使用しています。seek()しかし、メソッドを使用した後、 currentTimeProperty が信頼できないことに気付きました。

以下のコードのメソッド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));
        }
    });

}
4

1 に答える 1