2013-03-18 3 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.

Учебное пособие содержит информацию о включении временной шкалы игрока.

Вот скриншот видеопроигрывателя JavaFX с временной шкалой от Ensemble.

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 я не успех решения вы предоставили here.I думаю, я не упомянул мои проблемы clearly.I отредактировали мой оригинальный question.Can вы плз бы заглянуть в него Еще раз спасибо. Очень много. – aaaa

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

, относящиеся к первоначальному вопросу и расширить точки Николая:

Использование исходного кода Oracle от «http://docs.oracle.com/javafx/2/swing/media-player.htm» найдено в исходном коде MediaPlayer .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())); 
    } 
}); 
Смежные вопросы