正确使用VLCj

时间:2012-10-04 21:03:35

标签: java libvlc vlcj

我尝试使用VLCj来访问网络摄像头。我正在使用此代码:

public static void main(String[] args) {
    // Create player.
    MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory();
    DirectMediaPlayer mediaPlayer = mediaPlayerFactory.newDirectMediaPlayer(
            320, 240, 
            new RenderCallback() {
                @Override
                public void display(Memory arg0) {
                    // Do nothing.
                }
         });

    // Options setup.
    String[] options = new String[]{};
    String mrl = "v4l2:///dev/video0"; // Linux

    // Start preocessing.
    mediaPlayer.startMedia(mrl, options);

    BufferedImage bufImg;
    for (int i = 0; i < 1000; ++i) {
        bufImg = mediaPlayer.getSnapshot();

        // Do something with BufferedImage...
        // ...
    }

    // Stop precessing.
    mediaPlayer.stop();
    mediaPlayer = null;

    System.out.println("Finish!");
}

此代码部分有效 - 我可以使用BufferedImage,但是:

  • 我输出了错误[0x7f0a4c001268] main vout display error: Failed to set on top
  • 当主循环结束且相机被禁用时程序未完成!我看到Finish!消息,但程序没有将控制权返回到IDE或控制台。

UPD: 我正在使用openSUSE 12.2 x64,VLC 2.0.3安装并正常运行所有视频文件,库VLCj 2.1.0。

2 个答案:

答案 0 :(得分:3)

此代码正常运行:

public static void main(String[] args) {
    // Configure player factory.
    String[] VLC_ARGS = {
            "--intf", "dummy",          // no interface
            "--vout", "dummy",          // we don't want video (output)
            "--no-audio",               // we don't want audio (decoding)
            "--no-video-title-show",    // nor the filename displayed
            "--no-stats",               // no stats
            "--no-sub-autodetect-file", // we don't want subtitles
            "--no-inhibit",             // we don't want interfaces
            "--no-disable-screensaver", // we don't want interfaces
            "--no-snapshot-preview",    // no blending in dummy vout
    };
    MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory(VLC_ARGS);

    // Create player.
    HeadlessMediaPlayer mediaPlayer = mediaPlayerFactory.newHeadlessMediaPlayer();

    // Select input device.
    String mrl = "v4l2:///dev/video0";  // Linux

    // Start processing.
    mediaPlayer.startMedia(mrl);

    BufferedImage bufImg;
    for (int i = 0; i < 1000; ++i) {
        bufImg = mediaPlayer.getSnapshot();

        // Do something with BufferedImage...
        // ...
    }

    // Stop processing.
    mediaPlayer.stop();

    // Finish program.
    mediaPlayer.release();
    mediaPlayerFactory.release();
}

答案 1 :(得分:2)

恢复原生窗口:VLCj打开VLC库的共享实例。

无头媒体播放器不打算播放视频或音频!

事实上,如果您需要播放任何内容(而不是流向其他任何地方),您需要创建输出窗口或使用直接媒体播放器(可能要复杂得多) 因此,如果无头玩家需要玩某些东西,它会打开一个原生窗口来执行播放!

来源:http://www.capricasoftware.co.uk/wiki/index.php?title=Vlcj_Media_Players

重新出错:视频显示组件必须是面板,窗口或其添加的顶级组件。否则会抛出错误

  

主vout显示错误:无法设置在顶部

此外,如果您在组件上放置任何内容,它将销毁视频输出,这将不再有效!

无论如何,我不知道DirectMediaPlayer是如何工作的,但是VLCj有一些奇怪的行为......也许getSnapshot()需要一个视频显示组件,但我不确定。

重新开始你没有完成的程序:你加入完成自己的线程。这无法正常工作,因为您的线程会睡觉&#34;直到等待的另一个线程已被终止,但由于这是你自己的线程,它会睡觉#34;并且不会终止。 您可以使用main方法中的此短代码测试此行为:

System.out.println("Test start");
Thread.currentThread().join();
System.out.println("Test stop");

您将从不到达&#34;测试停止&#34;言。