2016-07-15 85 views
9

Sto provando a catturare il video utilizzando lo jxcapture. Riesco a farlo solo per una volta, ma quando sto cercando di catturare la seconda volta il video nello stesso programma ho avuto problemi. Il mio codice è il seguente:Risorse di sistema insufficienti, acquisizione di video da web camera java

public VideoCapture videoCapture = VideoCapture.create(VideoFormat.WMV); 
public CaptureVideoFromWebCamera(){} 

public void start(String filename){ 


    List<VideoSource> availableVideoSources = VideoSource.getAvailable(); 
    System.out.println("availableVideoSources = " + availableVideoSources); 

    if (availableVideoSources.isEmpty()) { 
     throw new IllegalStateException("No external video sources available"); 
    } 
    VideoSource webCamera = availableVideoSources.get(0); 
    System.out.println("webCamera = " + webCamera); 

    videoCapture.setVideoSource(webCamera); 

    java.util.List<Codec> videoCodecs = videoCapture.getVideoCodecs(); 
    System.out.println("videoCodecs = " + videoCodecs); 
    if (videoCodecs.isEmpty()) { 
     throw new IllegalStateException("No video codecs available"); 
    } 

    Codec videoCodec = videoCodecs.get(2); 
    System.out.println("videoCodec = " + videoCodec); 

    EncodingParameters encodingParameters = new EncodingParameters(new File("WebCamera.wmv")); 
    encodingParameters.setBitrate(500000); 
    encodingParameters.setFramerate(10); 
    encodingParameters.setKeyFrameInterval(1); 
    encodingParameters.setCodec(videoCodec); 

    videoCapture.setEncodingParameters(encodingParameters); 
    videoCapture.start(); 
    System.out.println("Recording started. Press 'Enter' to terminate."); 

} 

public void stop(String filename) throws IOException{ 
System.in.read(); 
videoCapture.stop(); 
} 


public static void main(String[] args) throws Throwable { 

    CaptureVideoFromWebCamera obj = new CaptureVideoFromWebCamera(); 
    obj.start(""); 
    obj.stop(""); 

    CaptureVideoFromWebCamera obj1 = new CaptureVideoFromWebCamera();  
    obj1.start(""); 
    obj1.stop(""); 

} 

}

Quando sto cercando di fare in modo da sto reveiving il seguente errore (risorse di sistema insufficienti per completare la webcam servizio richiesto):

Exception in thread "main" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException a com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStart (SourceFile: 103) a com.teamdev.jxcapture. VideoCapture.start (SourceFile: 146) a capturer.CaptureVideoFromWebCamera.start (CaptureVideoFromWebCamera.java:58) a capturer.CaptureVideoFromWebCamera.main (CaptureVideoFromWebCamera.java:76) causato da: java.lang.reflect.InvocationTargetException a com.teamdev.jxdesktop.win32.g .doInvokeAndWait (fonte sconosciuta) a com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStart (SourceFile: 97) ... 3 più causato da: com.teamdev.jxdesktop.win32.com.ComException: oggetto COM metodo restituisce il codice di errore: 0x800705AA; Esistono risorse di sistema insufficienti per completare il servizio richiesto.

EDIT2: ho provato a fare aggiungere un po 'di sonno thread per il codice al fine di attendere il secondo processo di cattura.

CaptureVideoFromWebCamera obj = new CaptureVideoFromWebCamera(); 
    obj.start("1.wmv"); 
    obj.stop(""); 
    Thread.sleep(5000); 
    CaptureVideoFromWebCamera obj1 = new CaptureVideoFromWebCamera();  
    obj1.start("2.wmv"); 
    obj1.stop(""); 

Ho ricevuto lo stesso errore.

Edit3: Quando io sto cercando di utilizzare lo stesso oggetto per la cattura ho ricevuto il seguente messaggio:

Exception in thread "main" java.lang.RuntimeException: java.lang.reflect. InvocationTargetException a com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStart (SourceFile: 103) a com.teamdev.jxcapture.VideoCapture.start (SourceFile: 146) a CaptureVideoFromWebCamera.start (CaptureVideoFromWebCamera.java:47)//videoCapture.start(); in CaptureVideoFromWebCamera.main (CaptureVideoFromWebCamera.java:64) /obj.start("2.wmv "); causati da: java.lang.reflect.InvocationTargetException a com.teamdev.jxdesktop.win32.g.doInvokeAndWait (fonte sconosciuta) a com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStart (SourceFile: 97) . .. 3 altro

+1

Provare ad aggiungere un po 'di tempo prima di richiamare la videocamera. L'operazione di arresto potrebbe non essere stata completata quando si sta tentando di avviare la fotocamera la seconda volta. O meglio ancora, prova con una GUI dove devi premere un pulsante per avviare e fermare la telecamera. – Olantobi

+0

Ho provato ad entrambi ho ancora lo stesso problema! –

+0

Sembra che videoStop interrompa la cattura, tuttavia le risorse per la fotocamera rimangono ancora in uso da java, quindi non posso inizializzare di nuovo il catturatore. Il programma interrompe l'acquisizione, tuttavia la fotocamera è ancora aperta e devo chiudere il programma affinché il mio carmera si chiuda. –

risposta

1

In realtà, si riceve un messaggio di errore perché la risorsa è già stata bloccata da un altro thread e il blocco non viene rilasciato mentre si tenta di utilizzare la stessa risorsa da un altro thread.

Qui, bisogna fare due cose principali:

Fase 1: Nel programma, il vostro avere configurazione Thread.Sleep(5000); ma in realtà mettere in pausa la discussione, invece, e non avete alcuna dichiarazione messa a punto di rilasciare la risorsa.Quindi, prova a reimpostare il socket della videocamera e l'oggetto di chiusura in un'istruzione finally.

Passaggio 2: provare il thread Synchronized anziché normale perché un solo processo può utilizzare la risorsa alla volta.

1

Può aiutarti? Penso che sia necessario rilasciare una risorsa dopo aver catturato per la prima volta che il prossimo processo di acquisizione potrebbe prenderlo liberamente.

private VideoSource webCamera; // make it as object field accessible both start and stop methods 

public void start(String file name) { 
    ... 
    webCamera = availableVideoSources.get(0); 
    ... 
    } 

public void stop(String filename) throws IOException{ 
    System.in.read(); 
    videoCapture.stop(); 
    webCamera.release(); 
} 
1

Prova a rimescolare il codice un po ', in modo da non inizializzare il sistema video due volte:

public VideoCapture videoCapture = VideoCapture.create(VideoFormat.WMV); 

public void init() { 

    List<VideoSource> availableVideoSources = VideoSource.getAvailable(); 
    System.out.println("availableVideoSources = " + availableVideoSources); 

    if (availableVideoSources.isEmpty()) { 
     throw new IllegalStateException("No external video sources available"); 
    } 
    VideoSource webCamera = availableVideoSources.get(0); 
    System.out.println("webCamera = " + webCamera); 

    videoCapture.setVideoSource(webCamera); 

    java.util.List<Codec> videoCodecs = videoCapture.getVideoCodecs(); 
    System.out.println("videoCodecs = " + videoCodecs); 
    if (videoCodecs.isEmpty()) { 
     throw new IllegalStateException("No video codecs available"); 
    } 

    Codec videoCodec = videoCodecs.get(2); 
    System.out.println("videoCodec = " + videoCodec); 
} 

public void start(String fileName) { 
    EncodingParameters encodingParameters = new EncodingParameters(new File(fileName)); 
    encodingParameters.setBitrate(500000); 
    encodingParameters.setFramerate(10); 
    encodingParameters.setKeyFrameInterval(1); 
    encodingParameters.setCodec(videoCodec); 

    videoCapture.setEncodingParameters(encodingParameters); 
    videoCapture.start(); 
    System.out.println("Recording started. Press 'Enter' to terminate."); 

} 

public void stop() throws IOException{ 
    System.in.read(); 
    videoCapture.stop(); 
} 


public static void main(String[] args) throws Throwable { 

    CaptureVideoFromWebCamera videoCapture = new CaptureVideoFromWebCamera(); 
    videoCapture.init(); 
    videoCapture.start("video1.wmv"); 
    videoCapture.stop(); 

    Thread.sleep(5000); 

    videoCapture.start("viedo2.wmv"); 
    videoCapture.stop(""); 
} 

Spero che questo aiuta, non ho di JxCapture licenza (né il web cam :)) per verificarlo.

Problemi correlati