我通过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命令中更新速度,但两个选项几乎都没有阻止延迟。
答案 0 :(得分:0)
运行时环境是问题:我在另一台计算机上启动此程序时,滞后消失了。