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

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

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.(jmfcam05v.java:49) at jmfcam05v.main(jmfcam05v.java:34) Java Result: 1 BUILD SUCCESSFUL (total time: 0 seconds) 

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

你在混合使用32位和64位吗? 我在Windows 7下遇到了类似的问题,原因是Windows 7,JRE和JMF之间存在64位不兼容问题。 简而言之,JMF只有32位,如果您的JRE是64位,则无法识别设备。

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

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

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