- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试制作一个多平台 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/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
Linux 管道可以缓冲多少数据?这是可配置的吗? 如果管道的两端在同一个进程中,但线程不同,这会有什么不同吗? 请注意:这个“同一个进程,两个线程”的问题是理论上的边栏,真正的问题是关于缓冲的。 最
我找到了here [最后一页] 一种有趣的通过 Linux 启动 Linux 的方法。不幸的是,它只是被提及,我在网上找不到任何有用的链接。那么有人听说过一种避免引导加载程序而使用 Linux 的方法
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我试图了解 ld-linux.so 如何在 Linux 上解析对版本化符号的引用。我有以下文件: 测试.c: void f(); int main() { f(); } a.c 和 b.c:
与 RetroPie 的工作原理类似,我可以使用 Linux 应用程序作为我的桌面环境吗?我实际上并不需要像实际桌面和安装应用程序这样的东西。我只需要一种干净简单的方法来在 RaspberryPi 上
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
有什么方法可以覆盖现有的源代码,我应该用 PyQt、PyGTK、Java 等从头开始构建吗? 最佳答案 如果您指的是软件本身而不是它所连接的存储库,那么自定义应用程序的方法就是 fork 项目。据我所
我的情况是:我在一个磁盘上安装了两个 linux。我将第一个安装在/dev/sda1 中,然后在/dev/sda2 中安装第二个然后我运行第一个系统,我写了一个脚本来在第一个系统运行时更新它。
我在 i2c-0 总线上使用地址为 0x3f 的系统监视器设备。该设备在设备树中配置有 pmbus 驱动程序。 问题是,加载 linux 内核时,这个“Sysmon”设备没有供电。因此,当我在总线 0
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我正试图在 linux 模块中分配一大块内存,而 kalloc 做不到。 我知道唯一的方法是使用 alloc_bootmem(unsigned long size) 但我只能从 linux 内核而不是
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我有 .sh 文件来运行应用程序。在该文件中,我想动态设置服务器名称,而不是每次都配置。 我尝试了以下方法,它在 CentOS 中运行良好。 nohup /voip/java/jdk1.8.0_71/
我是在 Linux 上开发嵌入式 C++ 程序的新手。我有我的 Debian 操作系统,我在其中开发和编译了我的 C++ 项目(一个简单的控制台进程)。 我想将我的应用程序放到另一个 Debian 操
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我使用4.19.78版本的稳定内核,我想找到带有企鹅二进制数据的C数组。系统启动时显示。我需要在哪里搜索该内容? 我在 include/linux/linux_logo.h 文件中只找到了一些 Log
我知道可以使用 gdb 的服务器模式远程调试代码,我知道可以调试针对另一种架构交叉编译的代码,但是是否可以更进一步,从远程调试 Linux 应用程序OS X 使用 gdbserver? 最佳答案 当然
是否有任何可能的方法来运行在另一个 Linux 上编译的二进制文件?我知道当然最简单的是在另一台机器上重建它,但假设我们唯一能得到的是一个二进制文件,那么这可能与否? (我知道这可能并不容易,但我只是
我是一名优秀的程序员,十分优秀!