私はマルチプラットフォームのJAVAFXデスクトップアプリケーションを作ろうとしており、ビデオを再生したいのです。ここでは、サンプルコードされる -Linuxで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(10勝、x64の、JDKに完璧に動作here
を見つけることができます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
をしようとしたとき、それはlibavformat53と
E: Unable to locate package glib
同じ問題を言います。ビデオフォーマットの制限は問題ではないことに注意してください。私は自分のアプリのユーザーにビデオファイルを提供します。だから、もし私が1つのフォーマットの作業(例えばflv)をすることができれば、それはすべてのビデオをそのフォーマットに変換することができます。また、私はエンドユーザーがターミナルなどでコマンドを入力するなど、問題を起こさないようにしたくありません。私はこのアプリケーションを ".deb"ファイルとして配布したいと思います。ユーザーはdebファイルをダウンロードし、それをクリックしてインストールすることができます(ubuntuソフトウェアセンターなどを介して)。それは動作します(Linuxでビデオを再生します)。インストールが完了すると、まずアプリケーションを起動するとbashスクリプトが起動し、メインのjarファイルが起動します。私は2つのオプションを検討しています -
1) - debパッケージ自体にすべての依存関係(glib、libavformat)を指定して、アプリケーションと共にインストールします。しかし、問題は私がubuntu 16.10を使っていて、以前のlibs(glib2.28とlibavformat53)がrepoで利用できないということです。私はglib2.50とlibavformat57を見つけることができますが、彼らは動作していないようです(あるいは多分何か間違っている)。 debファイルに依存関係とリポジトリの両方を指定して簡単にインストールできるようにする方法はありますか?もしそうでなければ、私はおそらくユーザがrootアクセスを一度与えることを期待することができるので、これらのlibsを、アプリケーション起動時に起動するbashスクリプト経由でインストールすることが可能ですか?
2) - 「javafx.scene.media.MediaPlayer」を完全に削除し、hereのようなサードパーティのライブラリを使用することも検討しています。しかし、これらのソリューションはすべて、誰かが正しい方向を指すことによって私を助けることができるように、非常に複雑に見えます。また、これらのライブラリのほとんどはコピーレフト(GPL3/LGPL3)の下にあるように見えます。私は自分のアプリをソースにしておきたいと思っています。それは可能ですか?
Ps:これは私にとって初めてのStackoverflow投稿ですので、間違いがあれば私にご容赦ください。また、悪い英語のために申し訳ありません。 :)