1

JavaFx MediaPlayer を使用して .mp4 形式を再生しています。タイム ラインに問題があります。タイム ライン上の任意のポイントをクリックすると、そのポイントから再生されるはずです。そのために私は以下のコードを使用しました

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

しかし、これは正しく機能していません。上記の問題を解決するのを手伝ってもらえますか

前もって感謝します

4

3 に答える 3

1

JavaFX 用のビデオ プレーヤー コントロールの作成に関する Oracle の優れたチュートリアルがあります。

JavaFX Ensembleアプリケーションでチュートリアル プレーヤーの動作を確認できます。

チュートリアルには、プレーヤー タイムラインの組み込みに関する情報が含まれています。

Ensemble の Timeline を使用した JavaFX Video Player Control のスクリーンショットを次に示します。

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.
于 2013-03-18T17:34:14.253 に答える
0

元の質問に関連し、ニコライのポイントを拡張するには:

ソース コード MediaPlayer.zip にある" http://docs.oracle.com/javafx/2/swing/media-player.htm "からの Oracle のオリジナル コードを使用すると、コードは次の問題に悩まされます。ユーザーがスライダー内のボタン/ノブ ウィジェットまたはノブの外側のバー領域をクリックすると、値が適切に変更されます。ただし、メディアが再生されている場合、ユーザーは再生時間の位置または音量をノブを動かすことによってのみ調整できます。また、ビデオの再生中に、ノブ ウィジェットを介してスライダーの動きが鈍くなります。

修正の問題は、Nikolay の提案によって軽減されます。この提案は、両方のスライダーに追加する必要があります。両方のスライダーを下のこの 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;
    }
}
于 2014-02-10T20:03:34.367 に答える
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)
    }
  }
})
于 2013-12-26T13:05:36.127 に答える