使用JAVA播放媒体文件

时间:2012-04-10 08:38:06

标签: java jmf vlcj

我想构建一个踏实安全的JAVA应用程序:

  1. 播放* .mp4或其他格式的高清媒体文件(全屏模式1920x1080)
  2. 向applet添加事件绑定(我将使用触摸屏监视器)
  3. 我试图搜索很多,但发现只有过时的JMF(VLCJ等)的例子。 所以我想让你问一下从哪里开始构建这个applet。 我可以包含哪些库。

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

    请分享您的想法,我该怎么做。任何代码示例都会很棒。

3 个答案:

答案 0 :(得分:3)

我会推荐vlcj,因为我确信它具有你可能需要或拥有的所有格式。它根本没有过时且很容易入手。如果你想以图形方式显示视频我不认为你会发现这么简单你提到的说明,但如果你组织我将提及的所有步骤并进行更深入的解释,你会发现vlcj是处理这类媒体的最佳选择(因为我认为)。我也喜欢并推荐JavaFx因为你可以用它做的效果,但我很难设置和编码那些东西。

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

步骤

1)所以应该首先做的是下载vlc媒体播放器(我们需要在32位或64位计算机环境中播放的32位版本)。我有一个糟糕的月份试图配置为什么我的应用程序不是成功加载所需的库,发现当你运行一个jar exetutable文件时,它运行在32位jvm上(eclipse运行在64位jvm,一切都很好。这就是为什么我们需要32位版本),而我有64位如果您下载并安装32位vlc媒体播放器,请在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文件夹中放置关注罐子:jna-3.5.1.jar,platform-3.5.1.jar,vlcj-2.2.0.jar。你可以从vlcj google project找到这些罐子。然后只需将它们包含在你的类路径中(选择它们和右键单击 - >添加到构建路径或转到项目属性 - > Java构建路径并添加这些3个罐子。。在我们开始使用播放器设置进行任何编码之前,所有内容都要进行设置。

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等)变得可显示。接下来我动态地计算我的路径,我的runnable 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可以为你播放的一些媒体文件类型。我做的是打开一个文件对话框来选择一个文件,如果我选择一个文件我保持其路径(有用的说vl​​cj在哪里寻找它。)

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

player.play();

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

6)如果你完成了那些你需要做的就是将你的项目导出到一个可运行的jar文件到你最初创建的MyProject文件夹并运行它(通过双击它来注意(不是从控制台)(否则它将是运行64位jvm,你不希望这导致你有32位原生和vlcj不接受这些冲突)))

总之,我必须说这些步骤对我有用。我希望他们能帮助你进一步开展应用程序开发。

此致 PeGiannOS

答案 1 :(得分:2)

首先你需要

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

Player mediaPlayer = Manager.createRealizedPlayer( mediaURL );

现在

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

我希望它有用!

答案 2 :(得分:0)

VLCJ并没有过时,它积极开发,非常灵活,功能强大。我在我的应用程序中使用它同时在应用程序内显示多个视频流,以及同时执行文本覆盖等操作。这样做有时很棘手,但绝对可能。

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