Ich versuche, eine Multi-Plattform JAVAFX Desktop-App zu machen, und ich will es ein Video zu spielen. Hier ist ein Beispielcode -Wie man Video in JavaFX unter Linux
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.stage.Stage;
import java.io.File;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
AnchorPane anchorPane = new AnchorPane();
MediaView mediaview = new MediaView();
anchorPane.getChildren().addAll(mediaview);
primaryStage.setTitle("Linux Video Play Test");
primaryStage.setScene(new Scene(anchorPane, 540, 210));
primaryStage.show();
File file=new File("video.flv");
Media media=new Media(file.toURI().toString());
MediaPlayer mediaplayer = new MediaPlayer(media);
mediaview.setMediaPlayer(mediaplayer);
mediaplayer.play();
}
public static void main(String[] args) {
launch(args);
}
}
'video.flv' ist in dem gleichen Ordner und den Codec Informationen können here
Der obige Code funktioniert perfekt auf Windows (Win 10, X 64, JDK finden 1.8.92), sondern gibt den folgenden Fehler auf Linux (Ubuntu 16.10, x64, JDK 1.8.112) -
Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
at java.lang.Thread.run(Thread.java:745)
Caused by: MediaException: UNKNOWN : com.sun.media.jfxmedia.MediaException: Could not create player! : com.sun.media.jfxmedia.MediaException: Could not create player!
at javafx.scene.media.MediaException.exceptionToMediaException(MediaException.java:146)
at javafx.scene.media.MediaPlayer.init(MediaPlayer.java:511)
at javafx.scene.media.MediaPlayer.<init>(MediaPlayer.java:414)
at Main.start(Main.java:24)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at com.sun.glass.ui.gtk.GtkApplication.lambda$null$49(GtkApplication.java:139)
... 1 more
Caused by: com.sun.media.jfxmedia.MediaException: Could not create player!
at com.sun.media.jfxmediaimpl.NativeMediaManager.getPlayer(NativeMediaManager.java:274)
at com.sun.media.jfxmedia.MediaManager.getPlayer(MediaManager.java:118)
at javafx.scene.media.MediaPlayer.init(MediaPlayer.java:467)
... 11 more
Process finished with exit code 1
Wie kann ich es auf Linux funktioniert? Ich verstehe, dass es einige Abhängigkeiten sind wie 'glib', 'libavformat' usw. Aber wenn ich
versuchtsudo apt-get install glib
es sagt
E: Unable to locate package glib
gleiche Problem mit libavformat53. Bitte beachten Sie, dass die Einschränkung des Videoformats kein Problem ist. Ich stelle die Videodateien den Nutzern meiner App zur Verfügung. Wenn ich es also schaffen kann, nur ein Format zu bearbeiten (zB flv), dann kann ich alle Videos in dieses Format konvertieren. Außerdem möchte ich nicht, dass meine Endbenutzer irgendwelche Probleme machen, um es zum Laufen zu bringen, wie das Tippen von Befehlen am Terminal usw. Ich beabsichtige, die App als ".deb" -Datei zu verteilen, und ich möchte, dass es so ist Die Benutzer können einfach die Deb-Datei herunterladen und klicken Sie darauf und installieren Sie es (über Ubuntu Software Center, etc.) und es funktioniert (Play Video auf Linux). Nach dem Start startet die App zunächst ein Bash-Skript, das dann den Haupt-Krug startet. Ich erwäge zwei Optionen -
1) - Geben Sie alle Abhängigkeiten (glib, libavformat) im Deb-Paket selbst, damit sie mit der App installiert werden. Aber das Problem ist, ich bin auf Ubuntu 16.10 und die älteren libs (glib2.28 und libavformat53) sind nicht in Repo verfügbar. Ich kann glib2.50 und libavformat57 finden, aber sie scheinen nicht zu funktionieren (oder vielleicht mache ich etwas falsch). Gibt es eine Möglichkeit, die Abhängigkeit und den Repo in der Deb-Datei anzugeben, damit sie leicht installiert werden können? Wenn nicht, kann ich vielleicht erwarten, dass der Benutzer einmal Root-Zugriff gewährt, also kann ich diese Bibliotheken über das Bash-Skript installieren, das beim Start der App ausgelöst wird, ist das möglich?
2) - Ich überlege auch, "javafx.scene.media.MediaPlayer" vollständig zu entfernen und einige Drittanbieter-Bibliotheken wie here zu verwenden. Aber diese Lösungen scheinen alle sehr kompliziert zu sein, wenn jemand mir helfen kann, indem er in die richtige Richtung zeigt. Auch die meisten dieser Bibliotheken scheinen unter Copyleft (GPL3/LGPL3) zu sein und ich möchte meine App geschlossen halten. Ist das möglich?
Ps: Dies ist mein erster Post auf Stackoverflow, bitte entschuldige mich, wenn ich irgendwelche Fehler gemacht habe. Entschuldigung für schlechtes Englisch. :)