2009-10-03 11 views
7

मैं वेबकैम से वीडियो कैप्चर करने के लिए एक सॉफ्टवेयर लागू कर रहा हूं। मैंने ऐप्पल देव में MyRecorder नमूना देखा है और यह ठीक काम करता है।वेबकैम से कोको कैप्चर फ्रेम

मैं इस कोड के साथ वीडियो से एक स्नैपशॉट लेने के लिए एक बटन जोड़ने के लिए कोशिश की है:

- (IBAction)addFrame:(id)sender 
{ 
    CVImageBufferRef imageBuffer; 
    @synchronized (self) { 
     imageBuffer = CVBufferRetain(mCurrentImageBuffer); 
    } 
    if (imageBuffer) { 
    [ bla bla bla ]  
    } 
} 

लेकिन mCurrentImageBuffer हमेशा खाली है। मैं अपने वेबकैम से वर्तमान फ्रेम कैसे ले सकता हूं और mCurrentImageBuffer डाल सकता हूं?

मैं

(void)captureOutput:(QTCaptureOutput *)captureOutput 
        didOutputVideoFrame:(CVImageBufferRef)videoFrame 
        withSampleBuffer:(QTSampleBuffer *)sampleBuffer 
        fromConnection:(QTCaptureConnection *)connection 
{ 
    CVImageBufferRef imageBufferToRelease; 

    CVBufferRetain(videoFrame); 

    @synchronized (self) { 
     imageBufferToRelease = mCurrentImageBuffer; 
     mCurrentImageBuffer = videoFrame; 
    } 
    CVBufferRelease(imageBufferToRelease); 
} 

उपयोग करने के लिए कोशिश की है, लेकिन यह कभी नहीं कहा जाता है। मैं कॉल कैप्चर आउटपुट प्रतिनिधि विधि कब तय कर सकता हूं? कोई विचार?

धन्यवाद, एंड्रिया

+0

मैंने वीडियो प्रारंभिकरण के अंत में QTCaptureDecompressedVideoOutput परिभाषा कोड को स्थानांतरित कर दिया है और अब mCurrentImageBuffer खाली नहीं है, लेकिन डिस्क –

+0

पर कोई वीडियो सहेजा नहीं गया है [imagesnap] (http://iharder.sourceforge.net/current/ macosx/imagesnap /) ओपन-सोर्स प्रोजेक्ट वेबकैम चित्र लेने के लिए एक उद्देश्य-सी कमांड-लाइन टूल है। –

उत्तर

3

ऐसा लगता है कि आप अपने वेबकैम से वीडियो कैप्चर करने के लिए QTKit कैप्चर API का उपयोग करने का प्रयास कर रहे हैं। MyRecorder नमूना अनुप्रयोग इस एपीआई का उपयोग करके आप सबसे सरल कामकाजी वीडियो कैप्चर प्रोग्राम बना सकते हैं। यह आपके विवरण से स्पष्ट नहीं था, लेकिन आपको यह सुनिश्चित करने की ज़रूरत है कि आप उनके उदाहरण का पालन करें, और अपने वीडियो सत्र को उसी तरह से शुरू करें जैसे वे -awakeFromNib विधि में MyRecorderController में करते हैं। यदि आप नहीं करते हैं, तो आपको कोई भी वीडियो कैप्चर नहीं किया जाएगा।

जहां तक ​​आप जिस विधि का उपयोग करने का प्रयास कर रहे हैं, -captureOutput:didOutputVideoFrame:withSampleBuffer:fromConnection:QTCaptureDecompressedVideoOutput के लिए एक प्रतिनिधि विधि है। इस वर्ग का एक उदाहरण MyRecorder नमूना में मौजूद नहीं है, क्योंकि वह नमूना केवल संपीड़ित वीडियो को डिस्क पर रिकॉर्ड करता है। इसका उपयोग करने के लिए, आपको QTCaptureDecompressedVideoOutput का एक उदाहरण बनाने की आवश्यकता होगी, इसे पर -addOutput:error: का उपयोग करके संलग्न करें, और QTCaptureDecompressedVideoOutput उदाहरण के लिए प्रतिनिधि को अपनी कक्षा के लिए सेट करें।

QTKit इस तरह की चीज़ को कैसे संभालता है, इस बारे में अधिक जानकारी के लिए, आप QTKit Application Programming Guide के QTKit Capture अनुभाग से परामर्श ले सकते हैं।

+0

मैंने QTCaptureDecompressedVideoOutput को -awakeFromNib विधि पर घोषित कर दिया है और मैंने इसे QTCaptureSession में जोड़ा है, लेकिन इस मामले में, छवि कैप्चर ठीक काम करता है और वीडियो डिस्क पर सहेज नहीं जाता है। –

+0

समस्या यह है कि मेरे पास 2 प्रकार का addOutput है: QTCaptureDecompressedVideoOutput छवि को सहेजने के लिए और mcaptureMovieFileOutput वीडियो स्टोर करने के लिए। 2 आउटपुट होना संभव है या क्या मुझे 2 QTCapture सत्र को परिभाषित करना है? –

+0

आपको एक वीडियो इनपुट के साथ दो आउटपुट प्राप्त करने में सक्षम होना चाहिए। ऐप्पल उपरोक्त लिंक QTKit मार्गदर्शिका में इसके लिए एक फ्लोचार्ट दिखाता है। आपकी छवि कैप्चर प्रोसेसर कितनी गहन है? शायद यह वीडियो रिकॉर्डिंग होने की अनुमति देने के लिए पर्याप्त प्रतिनिधि विधि से वापस नहीं लौट रहा है। डिफ़ॉल्ट रूप से, वीडियो कैप्चर H.264 एन्कोडिंग का उपयोग करता है, जो कि बहुत भारी है। आप वीडियो को QTCompressionOptions240SizeMPEG4Video पर सेट करने का प्रयास कर सकते हैं और देखें कि क्या होता है। –

3

मैं

- (void)captureOutput:(QTCaptureOutput *)captureOutput 
           didOutputVideoFrame:(CVImageBufferRef)videoFrame 
           withSampleBuffer:(QTSampleBuffer *)sampleBuffer 
           fromConnection:(QTCaptureConnection *)connection 

उपयोग करने के लिए कोशिश की है, लेकिन यह कभी नहीं कहा जाता है।

क्या इस विधि को कैप्चर आउटपुट ऑब्जेक्ट के प्रतिनिधि को लागू करने वाला ऑब्जेक्ट है?

+1

यह मेरी समस्या है, मैं इस कदम को अच्छी तरह समझ नहीं पा रहा हूं। –

+0

आपको कैप्चर आउटपुट ऑब्जेक्ट के प्रतिनिधि होने की आवश्यकता है। Http://developer.apple.com/mac/library/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html और 'setDelegate:' कैप्चर आउटपुट ऑब्जेक्ट की विधि देखें। –

+0

बिल्कुल सही, मैंने ऐप्पल नमूना (बहुत उपयोगी) पर देखा है धन्यवाद! –

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