2013-06-18 43 views
6

Để phát tệp mp3, tôi đang sử dụng lớp javafx.scene.media.MediaPlayer. Nhưng tôi nhận thấy rằng currentTimeProperty không đáng tin cậy sau khi sử dụng phương thức seek().javaFX MediaPlayer getCurrentTime() không đáng tin cậy

Phương thức initMediaPlayer() trong mã bên dưới được gọi khi người dùng đã chọn một tệp mp3. Thời gian phát lại được hiển thị trong thanh trượt thời gian (=timeSlider) mà người dùng có thể di chuyển để bắt đầu phát lại từ bất kỳ điểm nào trong bài hát. Vị trí hiện tại trong bài hát cũng được hiển thị trong nhãn (=timeLabel).

Khi tôi bắt đầu phát lại với play(), và khi tôi tạm dừng hoặc khởi động lại bài hát với pause() hoặc stop(), mọi thứ đều hoạt động tốt.

Vấn đề là sau khi sử dụng seek(), currentTimeProperty không còn chính xác nữa. Điều này trở nên rất đáng chú ý đối với phần cuối của bài hát, sau đó là currentTimeProperty đôi khi dài hơn 4 giây so với tổng thời gian của bài hát.

Nguyên nhân của sự cố này và có cách nào để giải quyết vấn đề này không?

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

Bạn có [SSCCE] (http://sscce.org/) mô tả sự cố của bạn không? – ItachiUchiha

Trả lời

1

Bạn muốn ChangeListener<Duration>, không InvalidationListener.

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

Bạn có thể cung cấp chi tiết hơn một chút cho câu trả lời của mình không? – NT3RP

+1

@ NT3RP Tôi đã thêm một đoạn mã ví dụ. Anh ấy chỉ thêm người nghe sai. Tôi không chắc những câu hỏi tiếp theo có thể có. :) – Xabster

Các vấn đề liên quan