Ich habe seit Jahren nach der Richtung auf dieser Angelegenheit gesucht und ich poste hier endlich.JavaFX MediaPlayer - seek() -Methode lässt den Spieler hängen
Ich habe eine JavaFX-Anwendung mit MediaPlayer. Eines Tages begann die Suche nach einer späteren Position im Video (auf die zuvor nicht zugegriffen wurde), den Player aufzuhängen. Keine Statusänderung vor dem PLAYING, der Puffer wird geladen, Status bei READY, bevor ich seek() anrufe.
Zuerst dachte ich, es liegt daran, dass ich den Application-Thread verwarf und versuchte, den MediaPlayer zurück auf die Root zu setzen, und die Suchmethode funktionierte wie zuvor, schnell genug für mich. Aber aus einem Grund, den ich nicht bekommen kann, fing es wieder an zu hängen, mit den gleichen Symptomen. Jetzt, selbst mit dem einfachsten Code, hängt es auch.
Ich bin verzweifelt, die Wartezeit kann 30 Sekunden sein, um eine Position 2 Minuten später im Video zu erreichen. Sieht so aus, als würde der Media Player das gesamte Video erneut scannen, bis es die gewünschte gute Position gefunden hat. Dadurch wird mehr Zeit für eine spätere Position benötigt. Wenn zuvor auf die Position zugegriffen wurde, wird seek() nicht hängen ...
Bin ich der einzige mit diesem Problem?
Ich bin auf Mac OS EL Capitan, aber auch auf Windows VM versucht und ich bekomme das gleiche Verhalten.
Hier ist ein Standalone-Code, aber ich sehe nicht, wie es Ihnen helfen wird, die ich für ppl nicht einmal hoffen, zu reproduzieren:
wirdpublic 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();
}
}
Jede Hilfe so sehr geschätzt werden!