从多个USB摄像头捕获视频,并使用JAVA + Java小程序并排显示在UI中

时间:2011-09-14 11:21:53

标签: java webcam video-capture japplet

我必须制作 2 applet ,它将在TOMCAT服务器上运行,当我在客户端访问网页[HTML页面]时,我有 2个摄像头附加到客户端PC ,我想在客户端同时 2个网页上显示两个摄像头的视频

我尝试过使用JMF。出局是

  1. 在大多数机器中,它不能同时用于两台相机。它适用于一次捕获一个摄像头

  2. 它适用于某些机器,但每次打开网页时都必须选择相机。选择第一个小程序的摄像头1和第二个小程序的摄像头2。

  3. 有没有JMF的方式我可以在一台客户端PC上打开2个网页,在远程服务器上运行相同的2个小程序,并在每个页面上显示每个USBCAM的视频?

    我在与JMF合作时使用过这个。

    private void StartStreaming()
        {
            String mediaFile = "vfw:Micrsoft WDM Image Capture (Win32):0";
                try
                {
                    MediaLocator mlr = new MediaLocator(mediaFile);
                    _player = Manager.createRealizedPlayer(mlr);
    
                    if (_player.getVisualComponent() != null)
                    {
                        setSize(480, 320);
                        jpnVideoStream.add("South", _player.getVisualComponent());
                    }
                }
                catch (Exception e)
                {
                    System.err.println("Got exception " + e);
                }
                _player.start();
        }
    

    这是我的两个小程序中的内容。但正如我所说,大部分时间,它启动一个CAM,然后让设备正在使用,无法捕获消息。

    请建议任何解决方案。

3 个答案:

答案 0 :(得分:1)

问题是您尝试在两个小程序中使用相同的网络摄像头。

改为使用:

String mediaFile = "webcam 1"  in applet 1
String mediaFile = "webcam 2"  in applet 2

您的第一个网络摄像头是:vfw:Micrsoft WDM图像捕获(Win32):0

您可以通过以下方式检查您的第二个网络摄像头:使用JMStudio。 选择File-> Preferences-> Capture Devices,然后单击Detect Capture devices。

这也可以使用代码完成,但上面的代码更简单。我仍然列出代码:

Vector list = CaptureDeviceManager.getDeviceList(null);
int i;
CaptureDeviceInfo tempDevice;

  // List all the devices ...
    if( list!=null)  {

        if( list.size() == 0)
        {
            System.out.println("the device list is zero : ");
            System.exit(1);
        }

        System.out.println("The devices are : ");

        for( i=0;i< list.size() ;i++ ) {
            tempDevice = (CaptureDeviceInfo) list.elementAt(i);
            System.out.println(tempDevice.getName());   
        }   
    }

注意:如果代码有效,请尝试以管理员身份运行代码。

答案 1 :(得分:0)

如果我没记错,那么在你的代码(JMF实现)中,应该有一个列表/数组设备(资源)java试图从中读取数据(网络摄像头流)。我的猜测是,您需要以如下方式更改代码:如果资源1正忙,则尝试从资源2读取。从本质上讲,您将遍历整个资源列表,尝试阅读您可以使用的任何内容。

希望有所帮助。

答案 2 :(得分:0)

它可能适用于JavaCV http://code.google.com/p/javacv/