2016-07-15 20 views
9

Videoyu jxcapture kullanarak yakalamaya çalışıyorum. Bunu bir kerede yapabildim ama ikinci kez yakalamaya çalıştığımda aynı programdaki videoyu sıkıntıya soktum.Yetersiz sistem kaynakları, web kameralarından video yakalama 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(""); 

} 

yüzden aşağıdaki hatayı reveiving ediyorum yapmaya çalışıyorum}

(Sistem kaynakları yetersiz istenen hizmeti web kamera tamamlamak için var):

Kodum şudur iplik "ana" java.lang.RuntimeException içinde

İstisna: com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStart de java.lang.reflect.InvocationTargetException (sourceFile: 103) com.teamdev.jxcapture de . VideoCapture.start (SourceFile: 146)com.teamdev.jxdesktop.win32.g de java.lang.reflect.InvocationTargetException : Neden Olduğu capturer.CaptureVideoFromWebCamera.start (CaptureVideoFromWebCamera.java:58) capturer.CaptureVideoFromWebCamera.main (CaptureVideoFromWebCamera.java:76) de de.doInvokeAndWait (Bilinmeyen Kaynak) com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStart (SourceFile: 97) ... 3 daha Nedeniyle: com.teamdev.jxdesktop.win32.com.ComException: COM nesnesi yöntem hata kodu döndürür: 0x800705AA; İstenen hizmeti tamamlamak için yeterli sistem kaynağı mevcut değildir.

EDIT2: Ben ikinci yakalama işlemi için beklemek amacıyla koduna bazı iplik uyku eklemek yapmaya çalıştık.

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

Aynı hatayı aldım.

EDIT3: şu mesajı aldım yakalama için aynı nesneyi kullanmaya çalışıyorum zaman: dizisindeki

İstisna "ana" java.lang.RuntimeException: java.lang.reflect. CaptureVideoFromWebCamera.start de (CaptureVideoFromWebCamera.java:47) /: com.teamdev.jxcapture.VideoCapture.start (146 SourceFile) en : com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStart (103 SourceFile) de InvocationTargetException /videoCapture.start(); CaptureVideoFromWebCamera.main adresindeki (CaptureVideoFromWebCamera.java:64) /obj.start("2.wmv "); Yarattığı: : com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStart (97 SourceFile) de com.teamdev.jxdesktop.win32.g.doInvokeAndWait (Bilinmeyen Kaynak) de java.lang.reflect.InvocationTargetException . .. Daha fazla

+1

Fotoğraf makinesini tekrar aramadan önce biraz uyku süresi eklemeye çalışın. Fotoğraf makinesini ikinci kez başlatmaya çalışırken durdurma işlemi tamamlanmamış olabilir. Ya da daha iyisi, kamerayı başlatmak ve durdurmak için bir düğmeye basmanız gereken bir GUI ile test edin. – Olantobi

+0

İkisini de denedim hala aynı sorunu yaşıyorum! –

+0

VideoStop'un yakalamayı durdurduğu görünse de, kameranın geri dönüşleri hala java'da kullanımda kalıyor, bu yüzden tekrar kapıcıyı başlatamıyorum. Program durmaya devam ediyor ancak kamera hala açık ve arabamın kapanması için programı kapatmam gerekiyor. –

cevap

1

Aslında, kaynağınız başka bir iş parçacığı tarafından kilitlenmiş olduğundan ve aynı kaynağı başka bir iş parçacığından kullanmaya çalıştığınızda kilit açılmadığından, hata iletisi alıyorsunuz. senin kurulum Thread.Sleep(5000); var ama aslında bunun yerine iplik durdurabilir ve kaynağı serbest bırakmak için değil kurulum herhangi bir bildirimde bulunmamış, Programınızda :

Adım 1: Burada

, iki ana şeyler yapmak zorunda.Yani, finally ifadesinde kamera soketini ve kapanış nesnesini sıfırlamayı deneyin.

Adım 2: , bunun yerine, bir kerede yalnızca bir işlem kullanabildiğinden, normal olanı kullanarak deneyin.

1

Yardımcı olabilir miyim? Bir yakalama işleminin, bir sonraki yakalama işleminin serbestçe yapılabildiğini aldıktan sonra, bir kaynağı serbest bırakmanız gerektiğini düşünüyorum.

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

deneyin biraz kodunuzu görev değişikliği yapmayı, bu nedenle iki kez video sistemi başlatmak yoktur:

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

ben JxCapture lisansını (ne de web yoktur, bu yardımcı olur cam :)) bunu kontrol etmek için.

İlgili konular