如何在Linux上使用JavaFX播放视频

3

我正在尝试制作一个多平台的JAVAFX桌面应用程序,并希望它可以播放视频。 这是一个示例代码 -

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'与其编解码信息位于同一文件夹中,可在此处查看编解码信息。

以上代码在Windows(Win 10,x64,JDK 1.8.92)上完美运行,但在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

我该如何在Linux上使其运行? 我了解到有一些依赖项,例如'glib'、'libavformat'等。但是当我尝试时...
sudo apt-get install glib

它说

E: Unable to locate package glib

与libavformat53相同的问题。请注意,视频格式限制不是问题,我将向我的应用程序用户提供视频文件。因此,如果我可以使一个格式工作(比如flv),那就可以了,我可以将所有视频转换为该格式。此外,我不希望我的终端用户经历任何麻烦,例如在终端上键入命令等。我打算将应用程序分发为“.deb”文件,并希望用户只需下载deb文件并单击它即可安装它(通过ubuntu软件中心等),然后它可以正常工作(在linux上播放视频)。一旦安装,启动应用程序将首先触发一个bash脚本,然后启动主jar。我正在考虑两个选项 -
1)-在deb包本身中指定所有依赖项(glib,libavformat),以便它们随应用程序一起安装。但问题是我使用的是ubuntu 16.10,旧的库(glib2.28和libavformat53)不可用于repo。 我可以找到glib2.50和libavformat57,但它们似乎不起作用(或者可能我做错了什么)。 那么是否有一种方法可以在deb文件中同时指定依赖关系和repo,以便它们可以轻松安装?如果不行,我可以期望用户给予root访问权限一次,以便我可以通过在应用程序启动时触发的bash脚本安装这些库,这样行吗?
2)-我还考虑完全放弃“javafx.scene.media.MediaPlayer”,并使用一些第三方库,如这里。 但是,这些解决方案似乎都非常复杂,如果有人能够帮助我指明正确的方向,那就好了。此外,大多数这些库似乎都受copyleft(GPL3 / LGPL3)保护,而我想保持我的应用程序闭源。 这可行吗?
1个回答

1
Mediaplayer需要库libavformat54及其所有所需库。我在Debian 9(stretch)上尝试并获得了它。所需的库大多在Debian 7(wheezy)中,有一些仍在Debian 9中。您必须手动下载所有不属于您发行版的所需库,并使用dpkg进行安装。对于libmp3lame0,我遇到了最大的问题,因为您需要纯库,但您大多会找到重新打包的版本。 libavformat54需要libavcodec54和libavutil51_1.0.10。当您安装这两个库后,就可以安装libavformat54。因此,从这两个库开始,查看它们需要什么,并从互联网获取所需的库。我认为最好的网站是pkgs.org,以获取所需的库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接