2011-11-09 19 views
12

मैं वर्तमान में एक आईओएस ऐप विकसित कर रहा हूं जो फ़ोटो और वीडियो लेने के लिए कैमरा फीड पर CoreImage लागू करता है, और मैं थोड़ी सी तस्वीर में चला गया हूं।कई आउटपुट के साथ AVCaptureSession?

अब तक मैं इसे प्रयोग करके तस्वीरें कब्जा करने के लिए और उन्हें बचत के रूप में CoreImage के साथ नमूना बफ़र्स प्राप्त है और उन्हें हेरफेर करने के लिए AVCaptureVideoDataOutput का उपयोग कर दिया गया है, और फिर एक सरल पूर्वावलोकन प्रदर्शित, साथ ही।

जब मैं वीडियो रिकॉर्डिंग, लागू करने के लिए एक वीडियो के लिए SampleBuffers लेखन के रूप में मैं उन्हें AVCaptureVideoDataOutput से प्राप्त द्वारा की कोशिश की, यह एक बहुत ही धीमी गति से फ्रेम दर (शायद अन्य छवि संबंधित प्रसंस्करण कि चल रहा था की वजह से था) ।

तो मैं सोच रहा था, यह एक AVCaptureVideoDataOutput और एक AVCaptureMoveFileOutput एक साथ एक ही AVCaptureSession चल रहा है करने के लिए संभव है?

मैंने इसे तुरंत जाने दिया, और पाया कि जब मैंने अतिरिक्त आउटपुट जोड़ा, तो मेरे AVCaptureVideoDataOutput ने जानकारी प्राप्त करना बंद कर दिया।

यदि मैं इसे काम कर सकता हूं, तो मुझे आशा है कि इसका मतलब है कि मैं केवल दूसरे आउटपुट का उपयोग उच्च फ्रेम दर पर वीडियो रिकॉर्ड करने के लिए कर सकता हूं, और उपयोगकर्ता ने रिकॉर्डिंग बंद करने के बाद वीडियो पर पोस्ट-प्रोसेसिंग कर सकते हैं।

किसी भी मदद की सराहना की जाएगी।

+0

आप थे एक MOV/MP4 पर छवि लिखने के लिए AVAssetWriter का उपयोग कर? मैं एक कस्टम ओपनजीएल छवि प्रसंस्करण इंजन का उपयोग करता हूं और अभी भी 30fps पर रिकॉर्ड कर सकता हूं। मुझे लगता है कि CoreImage ओपनजीएल दक्षता के लिए समर्थित होगा। मुझे संदेह है कि आपको वापस पकड़ना क्या है छवियों का प्रदर्शन। क्या आप छवियों को प्रस्तुत करने के लिए ओपनजीएल का उपयोग कर रहे हैं, या आप कुछ अन्य एपीआई (संभवतः सीपीयू आधारित) का उपयोग कर रहे हैं? –

+0

क्या आपको एक व्यावहारिक समाधान मिला? – user454083

उत्तर

3

यह आपके विचार से आसान है।

देखें: AVCamDemo

  1. कब्जा AVCaptureVideoDataOutput का उपयोग कर डेटा।
  2. रिकॉर्डिंग से पहले एक नई प्रेषण कतार बनाएं, उदाहरण के लिए। recordingQueue: recordingQueue = dispatch_queue_create("Movie Recording Queue", DISPATCH_QUEUE_SERIAL);
  3. में captureOutput: didOutputSampleBuffer: fromConnection: विधि प्रतिनिधि, samplebuffer पर कब्जा, यह बनाए रखने, और रिकॉर्डिंग कतार में है, यह फ़ाइल पर लिखने:

    -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {  
    
        CFRetain(sampleBuffer); 
    
        dispatch_async(recordingQueue, ^{ 
    
         if (assetWriter) { 
    
          if (connection == videoConnection) { 
           [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeVideo]; 
          } else if (connection == audioConnection) { 
           [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeAudio]; 
          } 
    
         } 
    
         CFRelease(sampleBuffer);   
        }); 
    } 
    
        - (void) writeSampleBuffer:(CMSampleBufferRef)sampleBuffer ofType:(NSString *)mediaType 
        { 
         CMTime presentationTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); 
    
         if (assetWriter.status == AVAssetWriterStatusUnknown) { 
    
          if ([assetWriter startWriting]) { 
           [assetWriter startSessionAtSourceTime:presentationTime]; 
          } else { 
           NSLog(@"Error writing initial buffer"); 
          } 
         } 
    
         if (assetWriter.status == AVAssetWriterStatusWriting) { 
    
          if (mediaType == AVMediaTypeVideo) { 
           if (assetWriterVideoIn.readyForMoreMediaData) { 
    
            if (![assetWriterVideoIn appendSampleBuffer:sampleBuffer]) { 
             NSLog(@"Error writing video buffer"); 
            } 
           } 
          } 
          else if (mediaType == AVMediaTypeAudio) { 
           if (assetWriterAudioIn.readyForMoreMediaData) { 
    
            if (![assetWriterAudioIn appendSampleBuffer:sampleBuffer]) { 
             NSLog(@"Error writing audio buffer"); 
            } 
           } 
          } 
         } 
        } 
    
+0

कृपया, स्विफ्ट 4 में कनवर्ट करें – user924

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