2017-03-01 6 views
3

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

versucht
sudo 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. :)

Antwort

0

Der Mediaplayer benötigt die Bibliothek libavformat54 und alle benötigten Bibliotheken. Ich habe es mit Debian 9 (stretch) ausprobiert und verstanden. Die benötigten Bibliotheken sind meistens in Debian 7 (wheezy), einige sind noch in Debian 9. Sie müssen alle benötigten Bibliotheken, die nicht Teil Ihrer Distribution sind, von Hand laden und mit dpkg installieren. Mit libmp3lame0 hatte ich die meisten Probleme, weil Sie die reine Bibliothek benötigen, aber Sie werden meistens eine neu gepackte Version finden. libavformat54 benötigt libavcodec54 und libavutil51_1.0.10. Wenn Sie diese beiden Bibliotheken installiert haben, können Sie libavformat54 installieren. Beginnen Sie also mit den beiden Bibliotheken und schauen Sie, was sie brauchen und holen Sie sich die benötigten Bibliotheken aus dem Internet. Ich denke, die beste Seite ist pkgs.org, um die benötigten Bibliotheken zu bekommen.

Verwandte Themen