2010-08-03 15 views
13

मैं डिफ़ॉल्ट कैमरा ऐप में देखी गई एनीमेशन का अनुकरण करने की कोशिश कर रहा हूं, जहां कैमरे के दृश्यदर्शी का स्नैपशॉट ऐप डिस्प्ले के कोने में एनिमेटेड है।AVCaptureVideoPreviewLayer: स्नैपशॉट लेना

AVCaptureVideoPreviewLayer उद्देश्य यह है कि इस समस्या को हल करने के लिए महत्वपूर्ण मानती है इन आवश्यकताओं के लिए बहुत खुला नहीं है: के साथ एक नई परत में इसकी एक प्रति बनाने के लिए ..

- (id)initWithLayer:(id)layer 

.. एक खाली रिटर्न की कोशिश कर रहा परत, छवि स्नैपशॉट के बिना, स्पष्ट रूप से यहां कुछ गहरा जादू चल रहा है।

आपके सुराग/बूस का स्वागत है।

एम

उत्तर

22

एक अलग कोण से एक ही संकट, का सामना करना पड़।

यहाँ संभव समाधान है कि कोई भी भी IMO महान हैं कर रहे हैं,:

  • आप एक AVCaptureSession को जोड़ सकते हैं दोनों एक AVCaptureStillImageOutput और एक AVCaptureVideoDataOutput। आप sessionPresetको AVCaptureSessionPresetHigh सेट जब आप API द्वारा फ्रेम होने लगेंगे, और जब आप AVCaptureSessionPresetPhotoकरने के लिए स्विच आप वास्तविक चित्र ले सकते हैं। तो तस्वीर लेने से पहले, आप वीडियो पर स्विच कर सकते हैं, एक फ्रेम प्राप्त कर सकते हैं और फिर कैमरे पर वापस जा सकते हैं। प्रमुख चेतावनी यह है कि कैमरा कैमरे और तस्वीर कैमरे के बीच स्विच करने के लिए कैमरे के लिए "लंबा" समय (कुछ सेकंड) लगता है।

  • एक अन्य विकल्प केवल कैमरा निर्गम (AVCaptureStillImageOutput) का उपयोग करने, और UIGetScreenImage का उपयोग फोन के स्क्रीन पर कब्जा पाने के लिए किया जाएगा। फिर आप नियंत्रण को फसल कर सकते हैं और केवल छवि छोड़ सकते हैं। यदि आप छवि पर यूआई नियंत्रण दिखा रहे हैं तो यह जटिल हो जाता है। इसके अलावा, this पोस्ट के अनुसार, ऐप्पल ने इस फ़ंक्शन का उपयोग करने वाले ऐप्स को अस्वीकार करना शुरू कर दिया (यह हमेशा iffy था)।

  • इनके अलावा मैंने AVCaptureVideoPreviewLayer के साथ खेलने का भी प्रयास किया। UIView या CALayer को UIImage में सहेजने के लिए this पोस्ट है। लेकिन यह सब स्पष्ट या सफेद छवियों का उत्पादन करता है। मैंने परत, दृश्य की परत, सुपरलेयर, प्रस्तुति लेयर, मॉडललेयर पर पहुंचने का प्रयास किया, लेकिन इसका कोई फायदा नहीं हुआ। मुझे लगता है कि में डेटा AVCaptureVideoPreviewLayer बहुत आंतरिक है, और वास्तव में नियमित परत आधारभूत संरचना का हिस्सा नहीं है।

उम्मीद है कि यह मदद करता है, ओड।

+0

जो उपरोक्त तीन में बेहतर @ ओडेड बेन डोव है। सबसे अच्छा सुझाव दें \ –

0

वहाँ पूर्वावलोकन के फ्रेम हड़पने के लिए 2 तरीके हैं .. AVCaptureVideoDataOutput & AVCaptureStillImageOutput :)

अपने कब्जा सत्र है वीडियो फ्रेम हड़पने के लिए है, तो एक चुने हुए फ्रेम से cgimage के साथ अपने परत बनाने सेटअप है।यदि यह स्थिरता के लिए सेटअप है, तो अपनी स्थिर छवि प्राप्त करने तक प्रतीक्षा करें और अपनी परत को उस सीजीमेज के स्केल किए गए संस्करण से बनाएं। अगर आपके पास अभी तक आपके सत्र में कोई आउटपुट नहीं है, तो आपको एक ऐसा लगता है जो मुझे लगता है। तब

AVCaptureVideoDataOutput *videoOutput = [[AVCaptureVideoDataOutput alloc] init]; 
videoOutput.videoSettings = @{ (NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA) }; 
[session addOutput:videoOutput]; 

dispatch_queue_t queue = dispatch_queue_create("MyQueue", NULL); 
[videoOutput setSampleBufferDelegate:self queue:queue]; 
dispatch_release(queue); 

, नीचे दिए गए प्रतिनिधि विधि को लागू अपनी छवि स्नैपशॉट प्राप्त करने के लिए:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { 

    UIImage *image = [self imageFromSampleBuffer:sampleBuffer]; 
    // Add your code here that uses the image. 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     _imageView.image = image; 
    }); 
} 

यह स्मृति की खपत और कम हो जाएगा

5

मैं तुम्हारे साथ वर्तमान सत्र के लिए एक AVCaptureVideoDataOutput जोड़ना चाहिए लगता है ऐप का प्रदर्शन। सुधार करने के लिए, आप भी अनुकूलन अपने AVCaptureVideoDataOutput साथ कर सकते हैं:

videoOutput.minFrameDuration = CMTimeMake(1, 15); 

तुम भी alwaysDiscardsLateVideoFrames उपयोग कर सकते हैं।

+0

छोटा नोट: 'हमेशा डिस्कार्ड्स लेटविडियोफ्रेम' डिफ़ॉल्ट रूप से 'सत्य' है – xaphod

-7

आईओएस 7 में शुरू होने से, आप अपने AVCaptureVideoPreviewLayer को लपेटने के UIView को स्नैपशॉट करने के लिए UIView::snapshotViewAfterScreenUpdates का उपयोग कर सकते हैं। यह UIGetScreenImage जैसा नहीं है, जो आपके ऐप को खारिज कर देगा।

UIView *snapshot = [self.containerView snapshotViewAfterScreenUpdates:YES]; 

किसी छवि में दृश्य बदलने के पुराने स्कूल के तरीके को याद करें। कुछ कारणों से यह कैमरे के पूर्वावलोकन को छोड़कर सबकुछ पर काम करता है:

UIGraphicsBeginImageContextWithOptions(self.containerView.bounds.size, NO, [UIScreen mainScreen].scale); 
[self.containerView drawViewHierarchyInRect:self.containerView.bounds afterScreenUpdates:YES]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+3

स्नैपशॉटव्यूएफ़रस्क्रीनअपडेट्स: AVCaptureVideoPreviewLayer पर काम नहीं करता है। –

+0

यह बहुत परेशान है कि यह पोस्ट किया गया था, यह AVCaptureVideoPreviewLayer पर काम नहीं करता है, बस बर्बाद समय –

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