3

我想构建一个安全的 JAVA 应用程序,它:

  1. 播放 *.mp4 或其他格式的高清媒体文件(全屏模式 1920x1080)
  2. 将事件绑定添加到小程序(我将使用触摸屏监视器)

我尝试了很多搜索,但只找到了 JMF(VLCJ 等)的过时示例。所以我想让你问从哪里开始构建这个小程序。我可以包含哪些库。

我在这里找到了一个类似的项目:Media Shuffle 但我希望我的媒体文件位于一个文件夹中,并且它们作为图标出现在应用程序中,这些图标启动选定的视频(VLC 全屏或其他跨平台媒体播放器)以在第一次触摸时播放。第二次触摸必须停止播放器并转到主页。

请分享您的想法,我该如何做到这一点。任何代码示例都会很棒。

4

3 回答 3

3

我会推荐 vlcj,因为我确信它具有您可能需要或拥有的所有格式。它一点也不过时,而且很容易上手。如果您想以图形方式显示视频,我认为您找不到像您这样简单的说明提及,但如果您组织我将提及并更深入地解释的所有步骤,您会发现 vlcj 是处理此类媒体的最佳选择(在我看来)。我也喜欢并推荐 JavaFx,因为您的效果可以用它来做,但对我来说,在这些东西中设置和编码太难了。

所以,让我们开始吧。首先,我想说我已经在基于 Swing 的应用程序(在 Windows 中)中实现了 vlcj,但这不应该让您感到难过,因为对于您提到的即时弹出播放器,我们可以制作一个 jdialog并将视频表面放置在其 contentPane 中。

脚步

1)所以应该做的第一件事是下载 vlc 媒体播放器(我们需要在 32 位或 64 位计算机环境中播放的 32 位版本)。我有一个糟糕的月份试图配置为什么我的应用程序没有加载所需的库成功并发现当您运行 jar 可执行文件时,它在 32 位 jvm 上运行(在 eclipse 中运行在 64 位 jvm 中,一切正常。这就是我们需要 32 位版本的原因),而我有 64 位本机库从加载。无论如何,如果您下载并安装 32 位 vlc 媒体播放器,请在 MyProject 中创建一个文件夹以包含您的项目(可以说“C:/MyProject”)创建另一个文件夹并将其称为“Needed”(这里我们将放置所有vlcj 所需的库才能正常工作)。现在从 C 的内容:\Program Files (x86)\VideoLAN\VLC 复制插件目录和 4 个 dll(axvlc.dll、libvlc.dll、libvlccore.dll、npvlc.dll)并将它们粘贴到您需要的文件夹中

2)现在,如果您在 Eclipse IDE 或类似环境中工作,则需要在项目中创建一个文件夹(比如说“lib”)并在其中创建另一个文件夹(将其命名为“jars”)。在 jars 文件夹中放置以下 jars: jna-3.5.1.jar、platform-3.5.1.jar、vlcj-2.2.0.jar。您可以从 vlcj google 项目中找到这些 jars。然后将它们包含到您的类路径中(选择它们并右键单击-> 添加到构建路径或转到项目属性->Java 构建路径并添加这 3 个 jar)。在我们开始使用播放器设置进行任何编码之前,这就是设置。

3)你必须在开始使用之前加载 vlcj。我只是使用这段代码来实现它(我会很快解释它,不要担心)。

public void LoadLibrary(){
    SwingWorker loadWorker;     


    loadWorker = new SwingWorker(){

        @Override
        protected Object doInBackground() throws Exception {
            // TODO Auto-generated method stub

            Thread.sleep(2000);

            path = new File("").getAbsolutePath().toString();
            path = path.replace(".", "");
            path = path.replace("\\", "//");
            path = path+"//Needed";

            if(RuntimeUtil.isWindows()){
                NativeLibrary.addSearchPath(
                        "libvlc",path



                            );
                            Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);




                    }
            else if(RuntimeUtil.isNix()){
                    NativeLibrary.addSearchPath(
                            "libvlc",path

                            );
            }



            mediaPlayerFactory = new MediaPlayerFactory();
            player = mediaPlayerFactory.newEmbeddedMediaPlayer();
            CanvasVideoSurface videoSurface = mediaPlayerFactory.newVideoSurface(canvas);
            player.setVideoSurface(videoSurface);


            return null;
        }

    };
    loadWorker.execute();

}

所以我要做的是为基于 Swing 的应用程序创建一个线程,因为如果您的媒体画布不可显示并且构造函数中的所有内容在其代码完成后完全构建,则您无法播放媒体。这意味着在制作播放器之前,我们应该首先为我们的构造函数创建一个延迟(我的是 2 秒)来结束他的工作,我们的 JFrame(或 jWindow 或 jDialog 等)变得可显示。接下来我动态计算我的路径,采用我的可运行 jar 的路径(注意:不是来自工作空间内部Eclipse)并进入Needed文件夹以实现所需的本机库。在if语句中,我告诉系统在我计算的特定路径中查找libvlc.dll,然后加载它,从而向前迈出一步来播放媒体文件。在 if-else 语句之外,我实际上创建了我的播放器并为其 VideoSurface 放置画布(画布是 Canvas java.awt 对象我使用 WindowsCanvas 因为我只在 Windows 中工作,你可以为 linux 或 mac 找到类似的画布(不用担心那!))在 Swing-Worker 字段(线程)之外,我只是告诉线程要执行(作为调用函数指令很重要)。

4)要播放文件,我只需在我的应用程序中的某个位置使用一个按钮,每次按下它时调用一个动作事件,以便我们在其中执行一些操作。例如,我制作一个 JFileChooser 来从中选择一个媒体文件。您可以轻松搜索对于它,但这是我的代码:

final JFileChooser chooser = new JFileChooser();

            FileNameExtensionFilter filter0 = new FileNameExtensionFilter(".wav", "wav");
            FileNameExtensionFilter filter1 = new FileNameExtensionFilter(".mp3","mp3");
            FileNameExtensionFilter filter2 = new FileNameExtensionFilter(".mpg","mpg");
            FileNameExtensionFilter filter3 = new FileNameExtensionFilter(".mp4","mp4");
            FileNameExtensionFilter filter4 = new FileNameExtensionFilter(".avi","avi");
            FileNameExtensionFilter filter5 = new FileNameExtensionFilter(".flv","flv");
            FileNameExtensionFilter filter6 = new FileNameExtensionFilter(".wmv","wmv");
            FileNameExtensionFilter filter7 = new FileNameExtensionFilter(".3gp", "3gp");
            FileNameExtensionFilter filter8 = new FileNameExtensionFilter(".swf", "swf");
            FileNameExtensionFilter filter9 = new FileNameExtensionFilter(".mkv", "mkv");
            FileNameExtensionFilter filter10 = new FileNameExtensionFilter(".flac", "flac");
            FileNameExtensionFilter filter11 = new FileNameExtensionFilter("Music & Videos","wav","mp3","mpg","mp4","avi","flv","wmv","3gp","swf","mkv","flac","VOB");
            FileNameExtensionFilter filter12 = new FileNameExtensionFilter("Music","wav","mp3","flac");
            FileNameExtensionFilter filter13 = new FileNameExtensionFilter(".VOB", "VOB");
            FileNameExtensionFilter filter14 = new FileNameExtensionFilter("Videos","mpg","mp4","avi","flv","wmv","3gp","swf","mkv","VOB");


            chooser.setFileFilter(filter14);
            chooser.setFileFilter(filter2);
            chooser.setFileFilter(filter3);
            chooser.setFileFilter(filter4);
            chooser.setFileFilter(filter5);
            chooser.setFileFilter(filter6);
            chooser.setFileFilter(filter13);
            chooser.setFileFilter(filter7);
            chooser.setFileFilter(filter8);
            chooser.setFileFilter(filter9);
            chooser.setFileFilter(filter12);
            chooser.setFileFilter(filter0);
            chooser.setFileFilter(filter1);
            chooser.setFileFilter(filter10);
            chooser.setFileFilter(filter11);   



            int returnVal = chooser.showOpenDialog(getParent());
            if(returnVal == JFileChooser.APPROVE_OPTION) {
                System.out.println("You chose to open this file: " +
                chooser.getSelectedFile().getName());
                File myfile1 = chooser.getSelectedFile();
                myfilepath1 = chooser.getSelectedFile().getAbsolutePath();
}

        player.startMedia("file:///"+myfilepath1);
                player.pause();     

这些文件过滤器是 vlcj 可以为你播放的一些媒体文件类型。我所做的是打开一个文件对话框以从中选择一个文件,如果我选择一个文件,我会保存它的路径(用于说明 vlcj 在哪里寻找它)。

5)现在播放文件你只需要输入以下代码:

player.play();

也许在另一个按钮的另一个动作事件中。

6)如果你写完这些你所要做的就是将你的项目导出到一个可运行的jar文件到你首先创建的MyProject文件夹中并运行它(注意双击它(不是从控制台(否则它将以64位运行) jvm 并且您不希望那样,因为您有 32 位本机并且 vlcj 不接受这些冲突)))

总之,我不得不说这些步骤对我有用。我希望它们能帮助你在你的应用程序开发中走得更远。

问候, PeGinnOS

于 2013-04-05T20:59:38.360 回答
2

首先你必须

// 创建一个播放器来播放 URL 中指定的媒体

Player mediaPlayer = Manager.createRealizedPlayer( mediaURL );

现在

mediaPlayer.start(); // start playing the media clip

我希望它有效!

于 2012-04-10T08:45:13.387 回答
0

VLCJ 并没有过时,它正在积极开发,并且在它可以实现的目标方面非常灵活和强大。我在我的应用程序中使用它来一次显示应用程序内的多个视频流,以及同时执行诸如文本覆盖之类的操作。有时这样做很棘手,但绝对有可能。

这里有许多基本的(最新的)示例可以帮助您开始使用VLCJ

于 2012-05-24T20:12:54.340 回答