2012-06-17 14 views
13

मैं एक दूसरे के बगल में दो UIViews में एक आईपैड 2 के सामने और पीछे के कैमरे की स्ट्रीम प्रदर्शित करना चाहता हूं। एक डिवाइस की छवि मैं निम्नलिखित कोडएकाधिक AVCapture सत्र चलाएं या एकाधिक इनपुट जोड़ें

AVCaptureDeviceInput *captureInputFront = [AVCaptureDeviceInput deviceInputWithDevice:[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo] error:nil]; 

AVCaptureSession *session = [[AVCaptureSession alloc] init]; 
session addInput:captureInputFront]; 
session setSessionPreset:AVCaptureSessionPresetMedium]; 
session startRunning]; 

AVCaptureVideoPreviewLayer *prevLayer = [AVCaptureVideoPreviewLayer layerWithSession:session]; 
prevLayer.frame = self.view.frame; 
[self.view.layer addSublayer:prevLayer]; 

जो या तो कैमरे के लिए ठीक काम करता है का उपयोग स्ट्रीम करने के लिए। समानांतर में स्ट्रीम को प्रदर्शित करने के लिए मैंने एक और सत्र बनाने की कोशिश की, लेकिन जैसे ही दूसरा सत्र स्थापित किया गया, पहला फ्रीज।

फिर मैंने सत्र में दो AVCaptureDeviceInput जोड़ने की कोशिश की लेकिन ऐसा लगता है कि इस समय अधिकांश इनपुट इनपुट समर्थित है।

कोई सहायक विचार दोनों कैमरों से स्ट्रीम कैसे करें?

+0

संभावित डुप्लिकेट [मैं सत्रों को पुनर्निर्माण किए बिना एक दूसरे AVCaptureSession में काम करने के लिए ऑटोफोकस कैसे प्राप्त कर सकता हूं?] (Http://stackoverflow.com/questions/5427561/how-can-i-get-autofocus-to-work -इन-ए-सेकेंड-एवेकप्चरेशन-बिना-रीरेटिंग) –

उत्तर

13

यह MacOS एक्स आप AVCaptureConnection वस्तुओं मैन्युअल सेटअप करने के लिए है पर कई वीडियो उपकरणों से CMSampleBufferRef रों पाने के लिए संभव है। उदाहरण के लिए, यह सोचते हैं आप इन वस्तुओं है:

AVCaptureSession *session; 
AVCaptureInput *videoInput1; 
AVCaptureInput *videoInput2; 
AVCaptureVideoDataOutput *videoOutput1; 
AVCaptureVideoDataOutput *videoOutput2; 

करो नहीं इस तरह outputs जोड़ें:, इसके बजाय

[session addOutput:videoOutput1]; 
[session addOutput:videoOutput2]; 

उन्हें जोड़ सकते हैं और सत्र नहीं बता किसी भी कनेक्शन बनाने के लिए:

[session addOutputWithNoConnections:videoOutput1]; 
[session addOutputWithNoConnections:videoOutput2]; 

फिर प्रत्येक इनपुट/आउटपुट जोड़ी के लिए इनपुट के वीडियो पोर्ट से कनेक्शन में कनेक्शन बनाते हैं मैन्युअल:

for (AVCaptureInputPort *port in [videoInput1 ports]) { 
    if ([[port mediaType] isEqualToString:AVMediaTypeVideo]) { 
     AVCaptureConnection* cxn = [AVCaptureConnection 
      connectionWithInputPorts:[NSArray arrayWithObject:port] 
      output:videoOutput1 
     ]; 
     if ([session canAddConnection:cxn]) { 
      [session addConnection:cxn]; 
     } 
     break; 
    } 
} 

अंत में, दोनों आउटपुट के लिए नमूना बफर प्रतिनिधियों तैयार करना न भूलें:

[videoOutput1 setSampleBufferDelegate:self queue:someDispatchQueue]; 
[videoOutput2 setSampleBufferDelegate:self queue:someDispatchQueue]; 

और अब आप दोनों उपकरणों से तख्ते पर कार्रवाई करने के लिए सक्षम होना चाहिए:

- (void)captureOutput:(AVCaptureOutput *)captureOutput 
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
     fromConnection:(AVCaptureConnection *)connection 
{ 
    if (captureOutput == videoOutput1) 
    { 
     // handle frames from first device 
    } 
    else if (captureOutput == videoOutput2) 
    { 
     // handle frames from second device 
    } 
} 

देखें कई वीडियो उपकरणों से लाइव पूर्वावलोकन के संयोजन के उदाहरण के लिए AVVideoWall sample project भी।

+0

धन्यवाद यह मेरे लिए एक अतिरिक्त काम के लिए काम करता है। मुझे यह भी करना पड़ा: [सत्र addInputWithNoConnections: VideoInput1]; [सत्र addInputWithNoConnections: VideoInput2]; –

+6

आईओएस 10 पर काम नहीं करता है - सत्र में दूसरा इनपुट जोड़ना विफल रहता है: असीमित अपवाद के कारण ऐप को समाप्त करना 'एनएसआईएनवालिडअर्गमेंट एक्सेप्शन', कारण: '*** - [AVCaptureSession addInputWithNoConnections:] एकाधिक ऑडियो/वीडियो AVCaptureInputs वर्तमान में समर्थित नहीं हैं –

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