JavaFX MediaPlayer:使用setRate改变速度Lags Video

时间:2017-10-02 05:48:16

标签: java video javafx media-player frame-rate

我通过JavaFX创建了一个基本的GUI,运行存储在本地计算机上的视频 - 我是通过MediaView完成的。在该GUI上,我在该视频下方添加了一个滑动条,对滑动条的任何更改都将导致视频更快或更慢(即滑动条可以使视频从.5速度变为1.5速度)。

问题是,每当用户移动滑块并改变视频的速度时,视频就会滞后。我编写了滑块,这样,如果视频速度改变了1/100,它将通过setRate方法更新速度/速率。 (例如,如果将滑块从1.00移动到1.01,速度将更新,但如果将其从1.001移动到1.002则不会更新。)因为用户将要更新视频的速度,所以每次速度改变时都不能延迟。如何阻止这种滞后?

这是我的start方法代码:

private MediaPlayer mediaPlayer;

public void start(Stage stage) {
    initializeMediaPlayer(); 
    MediaView mediaView = new MediaView(mediaPlayer);
    mediaView.setFitWidth(400);
    Slider speedSlider = initializeSlider();

    BorderPane borderPane = new BorderPane();
    borderPane.setCenter(mediaView);
    borderPane.setBottom(speedSlider);

    Scene scene = new Scene(borderPane);
    stage.setScene(scene);
    stage.setMaximized(true);
    stage.show();
}

我的initializeMediaPlayer代码:

private void initializeMediaPlayer(){
    Media media = new Media(getClass().getResource("Test.mp4").toString());
    mediaPlayer = new MediaPlayer(media);
    mediaPlayer.setAutoPlay(true);
    mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE);
}

我的initializeSlider代码:

private Slider initializeSlider(){
    Slider speedSlider = new Slider(.5, 1.5, 1); //(min,max,current_value)
    HBox.setHgrow(speedSlider, Priority.ALWAYS);
    speedSlider.setMaxWidth(800);
    speedSlider.setOrientation(Orientation.HORIZONTAL);
    speedSlider.valueProperty().addListener(new SliderListener(speedSlider));
    return speedSlider;
}

最后,我的speedSlider代码或者滑块事件监听器;它嵌入在主类中,这意味着它可以访问mediaPlayer全局变量。

private class SliderListener implements InvalidationListener{
    private Slider speedSlider;
    private double lastSpeed = 1.0;

    public SliderListener(Slider SS){
        speedSlider = SS;
    }

    public void invalidated(Observable observable) {    
        if (speedSlider.isValueChanging()) {
        double currentSpeed = Math.round( (int) (speedSlider.getValue() * 100) )/100.0; 
            if(currentSpeed != lastSpeed){
                lastSpeed = currentSpeed;
                mediaPlayer.setRate(currentSpeed);
            }
        }
    }

}

如何阻止这种滞后?再次,只要通过setRate更改速率,视频就会滞后。我尝试为程序分配更多的RAM,我尝试在Platform.runLater命令中更新速度,但两个选项几乎都没有阻止延迟。

1 个答案:

答案 0 :(得分:0)

运行时环境是问题:我在另一台计算机上启动此程序时,滞后消失了。