2013-03-18 113 views
1

我們使用JavaFx MediaPlayer播放.mp4格式的文件 我遇到了時間線問題,我的問題是如果我們點擊時間線上的任意一點,它應該播放 從那一點。爲此,我使用了下面的代碼如何在使用javafx播放視頻時使用時間線

timeSlider.setOnMouseClicked(new EventHandler<MouseEvent>() { 
    @Override 
    public void handle(MouseEvent t) { 
     mediaPlayer.seek(Duration.seconds(timeSlider.getValue())); 
     } 
    }); 

但這不能正常工作。任何一個可以幫助我解決上述問題,請提前

回答

1

由於沒有從Oracle約creating a Video Player Control for JavaFX一個偉大的教程。

您可以在JavaFX Ensemble應用程序中看到正在運行的教程播放器。

本教程包含有關合並玩家時間軸的信息。

下面是Ensemble帶有時間軸的JavaFX視頻播放器控件的屏幕截圖。

javafxmediaplayer

創建一個滑塊來控制MediaView位置的步驟如下:

  1. 創建MediaView和它相關的MediaPlayer
  2. 創建一個Slider來控制時間。
  3. 監聽對Slider的更改,並根據需要更新MediaPlayer的位置。
  4. 聽取對MediaPlayer當前時間的更改並根據需要更新Slider。從樣品

一些時間滑塊特定代碼片段:

// Media player 
MediaPlayer mp = new MediaPlayer(new Media(MEDIA_URL)); 

// Time label 
Label timeLabel = new Label("Time: "); 
timeLabel.setMinWidth(Control.USE_PREF_SIZE); 
mediaBar.getChildren().add(timeLabel); 

// Time slider 
timeSlider = new Slider(); 
HBox.setHgrow(timeSlider, Priority.ALWAYS); 
timeSlider.setMinWidth(50); 
timeSlider.setMaxWidth(Double.MAX_VALUE); 
timeSlider.valueProperty().addListener(new InvalidationListener() { 
    public void invalidated(Observable ov) { 
     if (timeSlider.isValueChanging()) { 
      // multiply duration by percentage calculated by slider position 
      if(duration!=null) { 
       mp.seek(duration.multiply(timeSlider.getValue()/100.0)); 
      } 
      updateValues(); 
     } 
    } 
}); 
.... 
protected void updateValues() { 
    if (playTime != null && timeSlider != null && volumeSlider != null && duration != null) { 
     Platform.runLater(new Runnable() { 
      public void run() { 
       Duration currentTime = mp.getCurrentTime(); 
       playTime.setText(formatTime(currentTime, duration)); 
       timeSlider.setDisable(duration.isUnknown()); 
       if (!timeSlider.isDisabled() && duration.greaterThan(Duration.ZERO) && !timeSlider.isValueChanging()) { 
        timeSlider.setValue(currentTime.divide(duration).toMillis() * 100.0); 
       } 
       if (!volumeSlider.isValueChanging()) { 
        volumeSlider.setValue((int) Math.round(mp.getVolume() * 100)); 
       } 
      } 
     }); 
    } 
} 
... 
mp.currentTimeProperty().addListener(new ChangeListener<Duration>() { 
    @Override 
     public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) { 
      updateValues(); 
    } 
}); 
// and also invoke updateValues when the MediaPlayer is played, paused, etc. 
+0

嗨Jewelsea感謝給了reply.I我不與你提供的解決方案以爲這兒過得我沒有提到我的問題clearly.I已經編輯我原來的question.Can你PLZ成功看看進去。再次感謝你非常多。 – aaaa 2013-03-19 12:12:50

0

裏面的滑塊值無效監聽器,如果用戶按下鼠標按鈕最近(例如,過去的100毫秒之內),你應該檢查。 Scala中的示例代碼(而不是簡單的翻譯到Java):

val timeSlider = new Slider { 
    /** 
    * @return true, if user was pressed mouse button within last `t` ms 
    */ 
    def mouseWasPressedWithinLast(t: Long): Boolean = 
    (System.currentTimeMillis() - lastTimeMousePressed) <= t 

    private var lastTimeMousePressed = 0l 

    addEventFilter(MouseEvent.MOUSE_PRESSED, (e: MouseEvent) => { 
    lastTimeMousePressed = System.currentTimeMillis() 
    }) 
} 

timeSlider.valueProperty().addListener(new InvalidationListener() { 
    def invalidated(ov: Observable) { 
    // Position should be updated in one of the two cases: 
    // 1. if user is sliding (then isValueChanging == true), or 
    // 2. if user clicked on slider to set it to new position (has recently pressed mouse button). 
    if (timeSlider.isValueChanging || timeSlider.mouseWasPressedWithinLast(100)) { 
     updatePosition(timeSlider.getValue) 
    } 
    } 
}) 
0

相關原來的問題,並就尼古拉的點擴大:

從源代碼中的MediaPlayer「http://docs.oracle.com/javafx/2/swing/media-player.htm」發現使用Oracle的原代碼.zip代碼存在以下問題。當用戶單擊滑塊內的按鈕/旋鈕小部件或旋鈕外部的小節區域時,該值會相應更改。但是,媒體播放時,用戶只能通過僅移動旋鈕來調整播放時間位置或音量。視頻播放時,滑塊也會通過旋鈕小部件緩慢移動。

尼古拉的建議緩解了修復問題。這個建議應該被添加到兩個滑塊。如果您將兩個滑塊更改爲下面的YieldingSlider,則即使在播放視頻時以及通過單擊滑塊或滑塊旋鈕來調整滑塊小部件時,也會看到更多的響應滑塊反應。

class YieldingSlider extends Slider 
{ 
    private long lastTimeMousePressed = 0; 

    public YieldingSlider() 
    { 
     addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() 
     { 
      @Override 
      public void handle(final MouseEvent event) 
      { 
       lastTimeMousePressed = System.currentTimeMillis(); 
      } 
     }); 
    } 

    public boolean mouseWasPressedWithinLast(long t) 
    { 
     return (System.currentTimeMillis() - lastTimeMousePressed) <= t; 
    } 
} 
-1

我也有問題,你指的是。我嘗試了一堆事件處理程序,這似乎對我很好。

slider.setMouseOnPressed(new EventHandler<MouseEvent>(){ 
    @Override 
    public void handle(MouseEvent event) { 
     player.seek(Duration.seconds(slider.getValue())); 
    } 
}); 
相關問題