2017-04-06 67 views
1

我一直在寻找年龄方向上的这个问题,我终于在这里发布。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(); 
} 
} 

任何帮助将因此不胜感激!

回答

0

你说得对 - 我不能重现你的问题。我有macOS Sierra 10.12.6。我所能说的只是检查你试图播放的电影的类型 - 并不是所有的编码都被支持。另外,根据文档,如果电影的持续时间是Duration.INDEFINITE,seek()将不起作用。