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

windows7上的java编程问题(在windows xp中运行良好),java,webcam,jmf,Java,Webcam,Jmf,我正在从连接到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 str

我正在从连接到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桌面上运行良好,如果我尝试在windows 7笔记本电脑上使用它,则会出现以下错误:

    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。
请帮助我解决此问题。

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


您可以试试看它是否能解决您的问题。

您是混合使用32位和64位安装吗?我在Windows7下也遇到了类似的问题,这是因为Windows7、JRE和JMF之间存在64位不兼容。简而言之,JMF只有32位,如果您的JRE是64位的,它将无法识别设备


完成以下操作后,我能够识别我的相机,避免了找不到视频格式以及jmfstudio检测不到视频捕获设备的问题。

感谢您的回复。请您指导我如何使用windows7?再次感谢您,但我的问题尚未解决。我遇到了同样的问题。请帮助我。