JavaFX MediaPlayer - seek()方法使播放器挂起

时间:2017-04-06 15:49:32

标签: javafx

我一直在寻找这方面的指导年龄,我终于在这里发帖了。

我有一个带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();
}
}

非常感谢任何帮助!

2 个答案:

答案 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();