windows7上java编程的问题(在windows xp上运行良好)

发布于 2024-08-22 09:02:45 字数 6473 浏览 9 评论 0原文

我正在从连接到 PC 的网络摄像头捕获视频。我使用以下代码来执行此操作:

import java.util.*;
import javax.media.*;
import javax.media.protocol.*;
import javax.media.control.*;
import javax.media.format.*;
import java.awt.*;
/**
* This is the primary class to run. It gathers an image stream and drives the processing.
*
*/
public class jmfcam05v
{
    DataSource dataSource;
    PushBufferStream pbs;

    Vector camImgSize = new Vector();
    Vector camCapDevice = new Vector();
    Vector camCapFormat = new Vector();

    int camFPS;
    int camImgSel;

    Processor processor = null;
    DataSink datasink = null;

    /**
    * Main method to instance and run class
    *
    */
    public static void main(String[] args)
    {
        jmfcam05v jmfcam = new jmfcam05v();
    }

    /**
    * Constructor and processing method for image stream from a cam
    *
    */
    public jmfcam05v()
    {
        // Select webcam format
        fetchDeviceFormats();
        camImgSel=0;    // first format, or otherwise as desired
        camFPS = 20;    // framerate

        // Setup data source
        fetchDeviceDataSource();
        createPBDSource();
        createProcessor(dataSource);
        startCapture();
        try{Thread.sleep(90000);}catch(Exception e){}   // 20 seconds
        stopCapture();
    }

    /**
    * Gathers info on a camera
    *
    */
    boolean fetchDeviceFormats()
    {
        Vector deviceList = CaptureDeviceManager.getDeviceList(new VideoFormat(null));
        CaptureDeviceInfo CapDevice = null;
        Format CapFormat = null;
        String type = "N/A";

        CaptureDeviceInfo deviceInfo=null;boolean VideoFormatMatch=false;
        for(int i=0;i<deviceList.size();i++)
        {
            // search for video device
            deviceInfo = (CaptureDeviceInfo)deviceList.elementAt(i);
            if(deviceInfo.getName().indexOf("vfw:")<0)continue;

            Format deviceFormat[] = deviceInfo.getFormats();
            for (int f=0;f<deviceFormat.length;f++)
            {
                if(deviceFormat[f] instanceof RGBFormat)type="RGB";
                if(deviceFormat[f] instanceof YUVFormat)type="YUV";
                if(deviceFormat[f] instanceof JPEGFormat)type="JPG";

                Dimension size = ((VideoFormat)deviceFormat[f]).getSize();
                camImgSize.addElement(type+" "+size.width+"x"+size.height);

                CapDevice = deviceInfo;
                camCapDevice.addElement(CapDevice);
                //System.out.println("Video device = " + deviceInfo.getName());

                CapFormat = (VideoFormat)deviceFormat[f];
                camCapFormat.addElement(CapFormat);
                //System.out.println("Video format = " + deviceFormat[f].toString());

                VideoFormatMatch=true;  // at least one
            }
        }
        if(VideoFormatMatch==false)
        {
            if(deviceInfo!=null)System.out.println(deviceInfo);
            System.out.println("Video Format not found");
            return false;
        }

        return true;
    }

    /**
    * Finds a camera and sets it up
    *
    */
    void fetchDeviceDataSource()
    {
        CaptureDeviceInfo CapDevice = (CaptureDeviceInfo)camCapDevice.elementAt(camImgSel);
        System.out.println("Video device = " + CapDevice.getName());
        Format CapFormat = (Format)camCapFormat.elementAt(camImgSel);
        System.out.println("Video format = " + CapFormat.toString());

        MediaLocator loc = CapDevice.getLocator();
        try
        {
            dataSource = Manager.createDataSource(loc);
        }
        catch(Exception e){}

        try
        {
            // ensures 30 fps or as otherwise preferred, subject to available cam rates but this is frequency of windows request to stream
            FormatControl formCont=((CaptureDevice)dataSource).getFormatControls()[0];
            VideoFormat formatVideoNew = new VideoFormat(null,null,-1,null,(float)camFPS);
            formCont.setFormat(CapFormat.intersects(formatVideoNew));
        }
        catch(Exception e){}
    }

    /**
    * Gets a stream from the camera (and sets debug)
    *
    */
    void createPBDSource()
    {
        try
        {
            pbs=((PushBufferDataSource)dataSource).getStreams()[0];
        }
        catch(Exception e){}
    }

    public void createProcessor(DataSource datasource)
    {
        FileTypeDescriptor ftd = new FileTypeDescriptor(FileTypeDescriptor.MSVIDEO);
        Format[] formats = new Format[] {new VideoFormat(VideoFormat.INDEO50)};
        ProcessorModel pm = new ProcessorModel(datasource, formats, ftd);
        try
        {
            processor = Manager.createRealizedProcessor(pm);
        }
        catch(Exception me)
        {
            System.out.println(me);
            // Make sure the capture devices are released
            datasource.disconnect();
            return;
        }
    }

    private void startCapture()
    {
        // Get the processor's output, create a DataSink and connect the two.
        DataSource outputDS = processor.getDataOutput();
        try
        {
            MediaLocator ml = new MediaLocator("file:capture.avi");
            datasink = Manager.createDataSink(outputDS, ml);
            datasink.open();
            datasink.start();
        }catch (Exception e)
        {
            System.out.println(e);
        }
        processor.start();
        System.out.println("Started saving...");
    }

    private void pauseCapture()
    {
        processor.stop();
    }

    private void resumeCapture()
    {
        processor.start();
    }

    private void stopCapture()
    {
        // Stop the capture and the file writer (DataSink)
        processor.stop();
        processor.close();
        datasink.close();
        processor = null;
        System.out.println("Done saving.");
    }
}

该程序在 Windows XP(台式机)上运行良好,但我尝试在 Windows7(笔记本电脑)上使用它,但出现以下错误

    run: Video Format not found 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
            at java.util.Vector.elementAt(Vector.java:427)
            at jmfcam05v.fetchDeviceDataSource(jmfcam05v.java:112)
            at jmfcam05v.<init>(jmfcam05v.java:49)
            at jmfcam05v.main(jmfcam05v.java:34) Java Result: 1 BUILD SUCCESSFUL (total time: 0 seconds)

:程序未检测到笔记本电脑上的内置网络摄像头,也未检测到外部网络摄像头。我正在使用 jmf 来捕获视频,并且我的所有网络摄像头均支持 vfw。 请帮我解决这个问题。

I am capturing video from webcam connected to pc.I am using the following code to do so:

import java.util.*;
import javax.media.*;
import javax.media.protocol.*;
import javax.media.control.*;
import javax.media.format.*;
import java.awt.*;
/**
* This is the primary class to run. It gathers an image stream and drives the processing.
*
*/
public class jmfcam05v
{
    DataSource dataSource;
    PushBufferStream pbs;

    Vector camImgSize = new Vector();
    Vector camCapDevice = new Vector();
    Vector camCapFormat = new Vector();

    int camFPS;
    int camImgSel;

    Processor processor = null;
    DataSink datasink = null;

    /**
    * Main method to instance and run class
    *
    */
    public static void main(String[] args)
    {
        jmfcam05v jmfcam = new jmfcam05v();
    }

    /**
    * Constructor and processing method for image stream from a cam
    *
    */
    public jmfcam05v()
    {
        // Select webcam format
        fetchDeviceFormats();
        camImgSel=0;    // first format, or otherwise as desired
        camFPS = 20;    // framerate

        // Setup data source
        fetchDeviceDataSource();
        createPBDSource();
        createProcessor(dataSource);
        startCapture();
        try{Thread.sleep(90000);}catch(Exception e){}   // 20 seconds
        stopCapture();
    }

    /**
    * Gathers info on a camera
    *
    */
    boolean fetchDeviceFormats()
    {
        Vector deviceList = CaptureDeviceManager.getDeviceList(new VideoFormat(null));
        CaptureDeviceInfo CapDevice = null;
        Format CapFormat = null;
        String type = "N/A";

        CaptureDeviceInfo deviceInfo=null;boolean VideoFormatMatch=false;
        for(int i=0;i<deviceList.size();i++)
        {
            // search for video device
            deviceInfo = (CaptureDeviceInfo)deviceList.elementAt(i);
            if(deviceInfo.getName().indexOf("vfw:")<0)continue;

            Format deviceFormat[] = deviceInfo.getFormats();
            for (int f=0;f<deviceFormat.length;f++)
            {
                if(deviceFormat[f] instanceof RGBFormat)type="RGB";
                if(deviceFormat[f] instanceof YUVFormat)type="YUV";
                if(deviceFormat[f] instanceof JPEGFormat)type="JPG";

                Dimension size = ((VideoFormat)deviceFormat[f]).getSize();
                camImgSize.addElement(type+" "+size.width+"x"+size.height);

                CapDevice = deviceInfo;
                camCapDevice.addElement(CapDevice);
                //System.out.println("Video device = " + deviceInfo.getName());

                CapFormat = (VideoFormat)deviceFormat[f];
                camCapFormat.addElement(CapFormat);
                //System.out.println("Video format = " + deviceFormat[f].toString());

                VideoFormatMatch=true;  // at least one
            }
        }
        if(VideoFormatMatch==false)
        {
            if(deviceInfo!=null)System.out.println(deviceInfo);
            System.out.println("Video Format not found");
            return false;
        }

        return true;
    }

    /**
    * Finds a camera and sets it up
    *
    */
    void fetchDeviceDataSource()
    {
        CaptureDeviceInfo CapDevice = (CaptureDeviceInfo)camCapDevice.elementAt(camImgSel);
        System.out.println("Video device = " + CapDevice.getName());
        Format CapFormat = (Format)camCapFormat.elementAt(camImgSel);
        System.out.println("Video format = " + CapFormat.toString());

        MediaLocator loc = CapDevice.getLocator();
        try
        {
            dataSource = Manager.createDataSource(loc);
        }
        catch(Exception e){}

        try
        {
            // ensures 30 fps or as otherwise preferred, subject to available cam rates but this is frequency of windows request to stream
            FormatControl formCont=((CaptureDevice)dataSource).getFormatControls()[0];
            VideoFormat formatVideoNew = new VideoFormat(null,null,-1,null,(float)camFPS);
            formCont.setFormat(CapFormat.intersects(formatVideoNew));
        }
        catch(Exception e){}
    }

    /**
    * Gets a stream from the camera (and sets debug)
    *
    */
    void createPBDSource()
    {
        try
        {
            pbs=((PushBufferDataSource)dataSource).getStreams()[0];
        }
        catch(Exception e){}
    }

    public void createProcessor(DataSource datasource)
    {
        FileTypeDescriptor ftd = new FileTypeDescriptor(FileTypeDescriptor.MSVIDEO);
        Format[] formats = new Format[] {new VideoFormat(VideoFormat.INDEO50)};
        ProcessorModel pm = new ProcessorModel(datasource, formats, ftd);
        try
        {
            processor = Manager.createRealizedProcessor(pm);
        }
        catch(Exception me)
        {
            System.out.println(me);
            // Make sure the capture devices are released
            datasource.disconnect();
            return;
        }
    }

    private void startCapture()
    {
        // Get the processor's output, create a DataSink and connect the two.
        DataSource outputDS = processor.getDataOutput();
        try
        {
            MediaLocator ml = new MediaLocator("file:capture.avi");
            datasink = Manager.createDataSink(outputDS, ml);
            datasink.open();
            datasink.start();
        }catch (Exception e)
        {
            System.out.println(e);
        }
        processor.start();
        System.out.println("Started saving...");
    }

    private void pauseCapture()
    {
        processor.stop();
    }

    private void resumeCapture()
    {
        processor.start();
    }

    private void stopCapture()
    {
        // Stop the capture and the file writer (DataSink)
        processor.stop();
        processor.close();
        datasink.close();
        processor = null;
        System.out.println("Done saving.");
    }
}

this program works well on windows xp(desktop) and wen i try to use it on windows7(laptop) it gives me the following error:

    run: Video Format not found 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
            at java.util.Vector.elementAt(Vector.java:427)
            at jmfcam05v.fetchDeviceDataSource(jmfcam05v.java:112)
            at jmfcam05v.<init>(jmfcam05v.java:49)
            at jmfcam05v.main(jmfcam05v.java:34) Java Result: 1 BUILD SUCCESSFUL (total time: 0 seconds)

my program is not detectin my inbuild webcam on laptop nor it is detecting external web cam.i am using jmf to capture the video and all my webcam's are vfw supported.
Please help me to solve this issue.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

活雷疯 2024-08-29 09:02:45

您是否混合使用 32 位和 64 位安装?我在 Windows 7 下也遇到了类似的问题,这是由于 Windows 7、JRE 和 JMF 之间的 64 位不兼容造成的。简而言之,JMF 仅是 32 位,如果您的 JRE 是 64 位,则无法识别设备。

按照这些说明操作后,我能够识别我的相机并避免“找不到视频格式”以及 jmfstudio 未检测到视频捕获设备。

Are you mixing 32 and 64-bit installs? I had a similar problem under Windows 7, and it was due to 64-bit incompatibilities between Windows 7, JRE and JMF. In short, JMF is only 32-bit and won't recognize devices if your JRE is 64-bit.

After following these instructions, I was able to recognize my camera and avoid the "Video Format not found" as well as the jmfstudio not detecting the video capture device.

无声静候 2024-08-29 09:02:45

Windows 7 安全性是否有可能阻止您访问设备,因此您的列表在 fetchDeviceDataSource() 调用中显示为空。

您可以尝试 关闭 UAC 并查看是否可以解决您的问题。

Is it possible that Windows 7 security is preventing you from accessing the device, thus your list shows up as empty from your fetchDeviceDataSource() call.

You can try turning off UAC and see if it fixes your problem.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文