【发布时间】: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