【问题标题】:JavaFX MediaPlayer: Changing Speed with setRate Lags VideoJavaFX MediaPlayer:使用 setRate Lags Video 改变速度
【发布时间】:2017-10-02 05:48:15
【问题描述】:

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

问题在于,每当用户移动滑块并改变视频的速度时,视频就会滞后。我对滑块进行了编程,这样,如果视频速度改变了 1/100,它将通过 setRate 方法更新速度/速率。 (例如,如果您将滑块从 1.00 移动到 1.01,速度会更新,但如果您将滑块从 1.001 移动到 1.002,它不会更新)。因为用户将相当多地更新视频的速度,所以每次速度改变时我都不能让它滞后。如何停止这种延迟?

这是我的启动方法代码:

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();
}

我的初始化媒体播放器代码:

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 命令中更新速度,但这两个选项几乎没有起到防止延迟的作用。

【问题讨论】:

  • 使用上面的代码,我在更改滑块值时看不到任何“明显”的滞后,也许它与计算机处理能力有关?无论如何,我建议像其他媒体播放器那样做,例如按“+,-”或有两个按钮和一个标签来增加和减少速度 + 以显示速度。然后,您将减少速度的总变化并减少延迟。
  • 你说得对:这与我电脑的处理能力有关。当我在另一台计算机上运行这个程序时,延迟几乎消失了。感谢您的帮助。

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


【解决方案1】:

运行环境是问题所在:我在另一台计算机上启动该程序后,延迟就消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-25
    • 2014-04-24
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多