我一直在寻找年龄方向上的这个问题,我终于在这里发布。JavaFX MediaPlayer - seek()方法让玩家挂起
我有一个JavaFX应用程序与MediaPlayer。有一天,在视频的后期寻找(以前没有被访问过的)开始挂机。在进入PLAYING之前没有状态改变,在调用seek()之前缓冲区被加载,状态为READY。
首先,我认为这是因为我退出了应用程序线程,试图将MediaPlayer重新放回到根目录,并且查找方法像以前一样工作,对于我来说足够快。 但是出于某种原因,我无法得到,它始终挂在一起,同样的症状。 现在,即使使用最简单的代码,它也会挂起。
我很绝望,等待时间可以是30秒,在视频中2分钟后到达某个位置。看起来媒体播放器正在重新扫描所有视频,直到它找到它正在寻找的好位置,因此需要更多时间才能找到后续位置。如果位置已被访问虽然之前,seek()不会挂起...
我是唯一一个有这个问题吗?
我在Mac OS EL Capitan上,但是在Windows VM上也尝试过,并且我得到相同的行为。
这里是一个独立的代码,但我看不出它如何帮助,我甚至不希望PPL重现:
public class VideoPlayerExample extends Application {
public static void main(String[] args) throws Exception {
launch(args);
}
@Override
public void start(final Stage stage) throws Exception {
File file = new FileChooser().showOpenDialog(stage);
Media media = new Media(file.toURI().toString());
MediaPlayer mp = new MediaPlayer(media);
mp.statusProperty().addListener(new ChangeListener<MediaPlayer.Status>() {
@Override
public void changed(ObservableValue<? extends Status> observable, Status oldValue, Status newValue) {
System.out.println(newValue);
}
});
Group gp = new Group(new MediaView(mp));
Button buttonTest = new Button("It's gonna hang...");
buttonTest.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
mp.pause();
System.out.println(mp.getCurrentTime().toMillis());
mp.seek(new Duration(mp.getCurrentTime().toMillis() +10000));
mp.play();
}
});
gp.getChildren().add(buttonTest);
stage.setScene(new Scene(gp, 540, 208));
stage.show();
}
}
任何帮助将因此不胜感激!