我一直在寻找这方面的指导年龄,我终于在这里发帖了。
我有一个带MediaPlayer的JavaFX应用程序。有一天,在视频的后期位置寻找(以前没有访问过),开始挂起播放器。在调用seek()之前,在进入PLAYING之前没有状态更改,缓冲区已加载,状态为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();
}
}
非常感谢任何帮助!
答案 0 :(得分:0)
你是对的 - 我无法重现你的问题。我有macOS Sierra 10.12.6。我只能说是你要尝试播放的电影类型 - 不是所有的编码都支持。另外,根据文档,如果电影的持续时间是Duration.INDEFINITE,则seek()将无效。
答案 1 :(得分:0)
将seek方法放置在JavaFX线程之外的新线程中。
new Thread(() -> mp.seek(new Duration(mp.getCurrentTime().toMillis() +10000)))).start();