java - 如何在 linux 上用 javaFX 播放视频

标签 java linux video javafx javafx-8

我正在尝试制作一个多平台 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”存在于同一文件夹中,可以找到编解码器信息here

上述代码在 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”并使用一些第三方库,如 here .但是这些解决方案似乎都非常复杂,所以如果有人可以通过指向正确的方向来帮助我。此外,这些库中的大多数似乎都属于 copyleft (GPL3/LGPL3),我希望我的应用程序保持封闭源代码。这可能吗?

Ps:这是我在 Stackoverflow 上的第一篇文章,所以如果我有任何错误,请原谅我。另外,抱歉英语不好。 :)

最佳答案

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

关于java - 如何在 linux 上用 javaFX 播放视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42538536/

相关文章:

java - ORMLite 外国 Collection

java - REST API 无法以 JSON 格式工作

java - Java/Maven 中 native 库的工作流

java - 无法将 Date 对象从 React 传递到后端到 Spring Boot

java - 如何在任务栏中创建简单的动画?

linux - 使用 Terraform 与 A​​zure VM 的 SSH 连接

linux - 检测是否在 bash 中设置了给定的环境变量(只给出了部分环境变量名称)

android - 如何在 android 中从服务器播放 mp4 视频?

c# - 有哪些网站提供有关 ASP.NET (C#) 的免费视频教程?

actionscript - 如何阻止 ustream 的嵌入式视频播放器从 https 抛出 ActionScript 错误?