2

我尝试使用 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 都可以正常工作。

4

2 回答 2

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();
}
于 2012-10-05T23:35:19.807 回答
2

重新打开您的本机窗口:VLCj 打开 VLC 库的共享实例。

无头媒体播放器不打算具有视频或音频输出!

事实上,如果您需要播放任何东西(而不是流式传输到其他任何地方),您需要创建一个输出窗口或使用直接媒体播放器(可能要复杂得多)所以,如果一个无头播放器需要播放一些东西打开一个本地窗口来执行播放!

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

再次出现错误:视频显示组件必须是面板、窗口或添加到任何位置的顶部组件。否则会抛出错误

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

此外,如果您在组件上放置任何东西,它会破坏无法再工作的视频输出!

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

重新您未完成的程序:您加入以完成自己的线程。这是行不通的,因为您的线程“休眠”,直到正在等待的另一个线程被终止,但由于这是您自己的线程,它“休眠”并且不会终止。您可以在 main 方法中使用此短代码测试此行为:

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

您将永远不会达到“测试停止”声明。

于 2012-10-04T21:41:47.390 回答