Apple लगातार डेवलपर्स को अच्छे आकार में रखता है।
आईपैड और आईफोन पर फ्रंट कैमरों ने क्षणिक अनुप्रयोगों के रचनाकारों से विचारों के एक नए दौर को जन्म दिया। मैंने ड्यूल-चेंबर फोन पर भी थोड़ा शोध किया और आपको बटन पर क्लिक करने के लिए आमंत्रित किया, यह किसके लिए दिलचस्प है।

आईओएस 4.3+ में वीडियो कैप्चर एक नारंगी की तरह सरल है।
चार कॉल - और आप किसी भी दो कैमरों के iPhone से प्राप्त पिक्सल के मालिक हैं।
थोड़ा सा कोड, डिजाइनर नहीं पढ़ते हैं
हम अपना HabrahabrView शुरू करते हैं
कक्षा HabrahabrView@class CaptureSessionManager; @interface HabrahabrView : UIView <AVCaptureVideoDataOutputSampleBufferDelegate> { CaptureSessionManager *captureFront; CaptureSessionManager *captureBack; UIImageView *face; }
क्लास बॉडी में, हम अनिवार्य कैप्चर ऑउटपुट फ़ंक्शन पेश करते हैं, जहां वीडियो कैमरा से चित्र 20 बार प्रति सेकंड आएगा।
कैप्चर ऑउटपुट फंक्शन -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
अब चूंकि सभी प्रारंभिक कार्य समाप्त हो चुके हैं, हम उस चित्र को स्क्रीन पर शुरू करते हैं जहां हमारा वीडियो प्रदर्शित किया जाएगा
छोटा इमेज व्यू 58 बाय 70 face = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 58, 70)]; [self addSubview:face];
इसी तरह हम रियर कैमरा को कनेक्ट करते हैं
रियर कैमरा तैयार है [self setCaptureBack:[[[CaptureSessionManager alloc] init] autorelease]]; [[self captureBack] addVideoInput:2 PView:self]; [[self captureBack] addVideoPreviewLayer]; [[[self captureBack] captureSession] setSessionPreset:AVCaptureSessionPresetLow];
और इसलिए सामने
फ्रंट कैमरा तैयार [self setCaptureFront:[[[CaptureSessionManager alloc] init] autorelease]]; [[self captureFront] addVideoInput:1 PView:self]; [[self captureFront] addVideoPreviewLayer]; [[[self captureFront] captureSession] setSessionPreset:AVCaptureSessionPresetLow];
आइए सभी कार्य एक अलग वर्ग में करें।
यहाँ बोरिंग कोड है, पढ़ें नहीं #import "CaptureSessionManager.h" @implementation CaptureSessionManager @synthesize captureSession; @synthesize previewLayer; - (id)init { if ((self = [super init])) { [self setCaptureSession:[[AVCaptureSession alloc] init]]; } return self; } - (void)addVideoPreviewLayer { [self setPreviewLayer:[[[AVCaptureVideoPreviewLayer alloc] initWithSession:[self captureSession]] autorelease]]; [[self previewLayer] setVideoGravity:AVLayerVideoGravityResizeAspectFill]; } - (void)addVideoInput:(int)camType PView:(HabrahabrView*) habraview { NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; AVCaptureDevice *videoDevice = nil; NSInteger side = (camType==1) ? AVCaptureDevicePositionFront : AVCaptureDevicePositionBack; for (AVCaptureDevice *device in videoDevices) { if (device.position == side) { videoDevice = device; break; } } if (videoDevice == nil) { videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; } if (videoDevice) { NSError *error; AVCaptureDeviceInput *videoIn = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error]; if (!error) { if ([[self captureSession] canAddInput:videoIn]) [[self captureSession] addInput:videoIn]; else NSLog(@"Couldn't add video input"); // Set the output AVCaptureVideoDataOutput* videoOutput = [[AVCaptureVideoDataOutput alloc] init]; // create a queue to run the capture on dispatch_queue_t captureQueue=dispatch_queue_create("catpureQueue", NULL); // setup our delegate [videoOutput setSampleBufferDelegate:habraview queue:captureQueue]; // configure the pixel format videoOutput.videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA], (id)kCVPixelBufferPixelFormatTypeKey, nil]; if ([[self captureSession] canAddOutput:videoOutput]) [[self captureSession] addOutput:videoOutput]; else NSLog(@"Couldn't add video ouput"); } else NSLog(@"Couldn't create video input"); } else NSLog(@"Couldn't create video capture device"); } - (void)dealloc { [[self captureSession] stopRunning]; [previewLayer release], previewLayer = nil; [captureSession release], captureSession = nil; [super dealloc]; } @end
हो गया।
कैमरों के साथ काम करें
फ्रंट कैमरा चालू करें
[[captureFront captureSession] startRunning];
सब कुछ काम करता है। जैसा कि आप कोड से देख सकते हैं, वीडियो को तीन प्रस्तावों में खींचा जा सकता है। मैं सबसे छोटी AVCaptureSessionPresetLow (192 पिक्सल के लगभग 144) गति के लिए चुनता हूं। हमारी जरूरतों के लिए यह एक ही समय में पर्याप्त है, और छवि फ़िल्टर मुफ़्त है।
अब रियर कैमरा कैसे चालू करें? आगे की ओर रुकें और पीछे की ओर मुड़ें
[[captureFront captureSession] stopRunning]; [[captureBack captureSession] startRunning];
मैं तुरंत दोनों को शामिल करना चाहता था। अफसोस। असंभव। मैंने कैमरों को जल्दी से स्विच करने की कोशिश की, लेकिन एक सेकंड के लगभग एक तिहाई की देरी है, जो जलन के अलावा कुछ भी नहीं करता है।
दो छवियों को ऑनलाइन ओवरले करने के सपने को मारना पड़ा।
Fruktozhorka
लेकिन कुछ बेवकूफ आवेदन के सपने को मत मारो। मैंने जल्दी से एक फल शटर बनाने का फैसला किया - फ्रंट कैमरे से छवि वास्तविक है, संतरे आभासी हैं।
संतरे स्क्रीन पर गिरने लगते हैं। उन्हें मुंह से लेना चाहिए और खाना चाहिए। जो भी 7 संतरे तेजी से खाता है वह एक पुरस्कार है।
यह मुंह की पहचान प्रक्रिया लिखने के लिए बनी हुई है।
मुंह को पहचानना एक आदिम सबक है, यहां तक कि मैंने, ओओपी, ओपनसिवी के शब्दों से लालसा में पड़ने वाले एक व्यक्ति ने इस समारोह को जल्दी से बनाया। OOP या OpenSiVi का उपयोग नहीं कर रहा है।
संकेत - आप नारंगी की स्थिति जानते हैं और उससे नृत्य करते हैं।
हाँ, चौकस पाठक का दावा है - मान्यता प्रक्रिया लेखक पर विशेष रूप से अपने कार्यस्थल को रोशन करते समय डिबग किया जाएगा। आप सही हैं, लेकिन उपयोगकर्ताओं की तस्वीरों को देखते हुए, आवेदन चीन से ब्राजील तक, कार्यालयों से अपार्टमेंट तक सफलतापूर्वक काम करता है।
बेशक, 7 वें नारंगी खाने के समय उपयोगकर्ता की एक तस्वीर खींचने के लिए एक बड़ा प्रलोभन था। मैं हमेशा प्रलोभनों के आगे झुकता हूं, क्योंकि वे फिर से नहीं हो सकते। आराम से! नैतिकता के प्रेमियों के लिए, मैंने एक बटन जोड़ा - अपनी तस्वीर भेजने की अनुमति दें। डिफ़ॉल्ट बंद है।
मैं एक खिलाड़ी की एक छोटी सी तस्वीर भेज रहा हूँ जिसकी माप ५ 70 है जो of० और गुप्त रूप से प्रशंसा करता है। बहुत ही मजेदार तस्वीरें सामने आती हैं। मैं कई बार 3 मिनट तक हंसता हूं।
भगवान के लिए, तस्वीरों के बारे में बात न करें, कॉर्पोरेट रहस्य रखें।
मैं पूरी तरह से भूल गया। मेरा रिकॉर्ड 12 सेकंड का है। मैं ओलंपिक के लिए तैयार हो रहा हूं।
लंदन में मिलते हैं, दोस्तों।