2016-07-15 7 views
9

मैं jxcapture का उपयोग कर वीडियो कैप्चर करने का प्रयास कर रहा हूं। मैं सिर्फ एक बार ऐसा करने में कामयाब रहता हूं लेकिन जब मैं दूसरी बार वीडियो को उसी कार्यक्रम में कैप्चर करने की कोशिश कर रहा हूं तो मुझे परेशानी हो गई।अपर्याप्त सिस्टम संसाधन, वेब कैमरा जावा से वीडियो कैप्चर करें

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

} 

}

जब मैं तो मैं निम्न त्रुटि reveiving कर रहा हूँ करने के लिए कोशिश कर रहा हूँ (अपर्याप्त सिस्टम संसाधन का अनुरोध सेवा वेब कैमरा पूरा करने के लिए मौजूद हैं):

मेरे कोड इस प्रकार है धागा "मुख्य" java.lang.RuntimeException में

अपवाद: com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStart पर java.lang.reflect.InvocationTargetException (sourcefile: 103) com.teamdev.jxcapture पर। VideoCapture.start (SourceFile: 146)capturer.CaptureVideoFromWebCamera.start (CaptureVideoFromWebCamera.java:58) capturer.CaptureVideoFromWebCamera.main (CaptureVideoFromWebCamera.java:76) पर परकी वजह से: com.teamdev.jxdesktop.win32.g पर java.lang.reflect.InvocationTargetException .doInvokeAndWait (अज्ञात स्रोत) com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStart (SourceFile: 97) ... 3 और कारण: com.teamdev.jxdesktop.win32.com.ComException: COM ऑब्जेक्ट विधि त्रुटि कोड देता है: 0x800705AA; अनुरोधित सेवा को पूरा करने के लिए अपर्याप्त सिस्टम संसाधन मौजूद हैं।

EDIT2: मैं आदेश दूसरा कैप्चरिंग प्रक्रिया के लिए प्रतीक्षा करने में कोड करने के लिए कुछ धागा नींद जोड़ने करने की कोशिश की।

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

मुझे एक ही त्रुटि मिली।

EDIT3: जब मैं कैप्चरिंग मैं निम्नलिखित संदेश मिला के लिए एक ही वस्तु का उपयोग करने के कोशिश कर रहा हूँ:

सूत्र में अपवाद "मुख्य" java.lang.RuntimeException: java.lang.reflect। com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStart (sourcefile: 103) में InvocationTargetException com.teamdev.jxcapture.VideoCapture.start (sourcefile: 146) में CaptureVideoFromWebCamera.start पर (CaptureVideoFromWebCamera.java:47)//videoCapture.start(); कैप्चरविडियो FromWebCamera.main पर (कैप्चरविडियोफ्रॉमवेबकैमेरा.जावा:64) /obj.start("2.wmv "); की वजह से: : com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStart (97 sourcefile) पर com.teamdev.jxdesktop.win32.g.doInvokeAndWait (अज्ञात स्रोत) पर java.lang.reflect.InvocationTargetException । .. 3 और

+1

कैमरे को दोबारा कॉल करने से पहले कुछ नींद का समय जोड़ने का प्रयास करें। जब आप दूसरी बार कैमरा शुरू करने का प्रयास कर रहे हों तो स्टॉप ऑपरेशन पूरा नहीं हो सकता है। या बेहतर अभी भी, एक जीयूआई के साथ परीक्षण करें जहां आपको कैमरा शुरू करने और रोकने के लिए एक बटन दबा देना है। – Olantobi

+0

मैंने उन दोनों की कोशिश की अभी भी मुझे एक ही समस्या मिली है! –

+0

ऐसा लगता है कि वीडियोस्टॉप कैप्चरिंग को रोकता है, हालांकि कैमरे के लिए संसाधन अभी भी जावा से उपयोग में रहते हैं, इसलिए मैं फिर से कैप्चरर को प्रारंभ नहीं कर सकता। कार्यक्रम कैप्चरिंग बंद कर देता है हालांकि कैमरा अभी भी खुला है और मुझे अपने कारमेरा को बंद करने के लिए प्रोग्राम बंद करना होगा। –

उत्तर

1

दरअसल, आपको त्रुटि संदेश मिल रहा है क्योंकि आपका संसाधन पहले से ही किसी अन्य धागे से बंद कर दिया गया है और जब आप एक ही थ्रेड से उसी संसाधन का उपयोग करने का प्रयास करते हैं तो लॉक जारी नहीं होता है।

चरण 1::

यहाँ, आप दो मुख्य बातों क्या करना है अपने कार्यक्रम में, अपने सेटअप Thread.Sleep(5000); है लेकिन यह वास्तव में इसके स्थान पर अपने धागा रोक सकते हैं और आप नहीं सेटअप किसी भी बयान संसाधन जारी करने के लिए है।तो, finally कथन में कैमरा सॉकेट और बंद ऑब्जेक्ट को रीसेट करने का प्रयास करें।

चरण 2: सामान्य रूप से उपयोग करने के बजाय Synchronized थ्रेड का प्रयास करें क्योंकि केवल एक ही प्रक्रिया एक समय में आपके संसाधन का उपयोग करने में सक्षम हो सकती है।

1

क्या यह आपकी मदद कर सकता है? मुझे लगता है कि आपको पहले कैप्चरिंग के बाद संसाधन को रिलीज़ करने की आवश्यकता है कि अगली कैप्चर प्रक्रिया इसे स्वतंत्र रूप से ले सकती है।

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

कोशिश अपने कोड थोड़ा फेरबदल करने के लिए है, तो आप दो बार वीडियो प्रणाली को प्रारंभ नहीं है:

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

मुझे आशा है कि इस मदद करता है, मैं JxCapture का लाइसेंस (और न ही वेब की जरूरत नहीं है कैमरा :)) यह जांचने के लिए।

संबंधित मुद्दे