2017-04-06 1 views
1

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:

wird
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(); 
} 
} 

Jede Hilfe so sehr geschätzt werden!

Antwort

0

Sie haben Recht - ich kann Ihr Problem nicht reproduzieren. Ich habe MacOS Sierra 10.12.6. Alles, was ich sagen kann, ist die Art des Films, den Sie versuchen zu spielen - nicht alle Kodierungen werden unterstützt. Wenn die Dauer des Films Duration.INDEFINITE ist, hat seek() laut der Dokumentation keine Auswirkungen.

Verwandte Themen