Pergunta

Estou capturando o vídeo da webcam conectado ao PC.Eu estou usando o seguinte código para fazer isso:

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.");
    }
}

Este programa funciona bem no Windows XP (Desktop) e eu tento usá -lo no Windows7 (laptop), ele me dá o seguinte erro:

    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)

Meu programa não está detectando minha webcam inbuild no laptop nem detectando web cam externo. Estou usando o JMF para capturar o vídeo e todas as minhas webcam são suportadas pelo VFW. Por favor, me ajude a resolver essa questão.

Foi útil?

Solução

Você está misturando instalações de 32 e 64 bits? Eu tive um problema semelhante no Windows 7 e foi devido a incompatibilidades de 64 bits entre o Windows 7, JRE e JMF. Em suma, o JMF tem apenas 32 bits e não reconhecerá dispositivos se o seu JRE for de 64 bits.

Depois de seguir estas instruções, Pude reconhecer minha câmera e evitar o "formato de vídeo não encontrado", assim como o jmfstudio não detectando o dispositivo de captura de vídeo.

Outras dicas

É possível que o Windows 7 Security esteja impedindo que você acesse o dispositivo, portanto, sua lista aparece como vazia da sua chamada FetchDevicedATAsource ().

Podes tentar Desativando o UAC E veja se isso corrige seu problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top