13

Ich möchte den Stream der vorderen und der hinteren Kamera eines iPad2 in zwei UIViews nebeneinander anzeigen. Um das Bild von einem Gerät streamen ich den folgenden CodeMehrere AVCaptureSessions ausführen oder mehrere Eingaben hinzufügen

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]; 

verwendet werden, die für jede Kamera einwandfrei funktioniert. Um den Stream parallel anzuzeigen, habe ich versucht, eine weitere Sitzung zu erstellen, aber sobald die zweite Sitzung eingerichtet ist, erstarrt die erste.

Dann habe ich versucht, zwei AVCaptureDeviceInput der Sitzung hinzuzufügen, aber scheint wie höchstens eine Eingabe im Moment unterstützt wird.

Haben Sie hilfreiche Ideen, wie Sie von beiden Kameras streamen können?

+0

möglich Duplikat von [Wie kann ich Autofokus in einer zweiten AVCaptureSession arbeiten lassen, ohne die Sitzungen neu zu erstellen?] (Http://stackoverflow.com/questions/5427561/how-can-i-get-autofocus-to-work -in-a-second-avcapturessession-ohne-neu zu erstellen) –

Antwort

13

Es ist möglich CMSampleBufferRef s von mehreren Videogeräten auf MacOS X. Sie Setup manuell die AVCaptureConnection Objekte zu erhalten. Zum Beispiel, vorausgesetzt, Sie diese Objekte haben:

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

Sie NICHT fügen Sie die Ausgänge wie folgt aus:

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

Stattdessen fügen sie und die Sitzung sagen, keine Verbindungen zu machen:

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

Dann für jedes Eingabe/Ausgabe-Paar die Verbindung vom Videoanschluss des Eingangs zum Ausgang herstellen manuell:

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; 
    } 
} 

Schließlich stellen Sie sicher, dass für beide Ausgänge Probenpuffer Delegierten setzen:

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

und jetzt sollten Sie in der Lage Frames aus beiden Geräten zu verarbeiten:

- (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 
    } 
} 

See auch die AVVideoWall sample project für ein Beispiel für die Kombination von Live-Vorschauen von mehreren Videogeräten.

+0

Danke das hat für mich mit einem Zusatz funktioniert. Ich musste auch tun: [Sitzung addInputWithNoConnections: videoInput1]; [Sitzung addInputWithNoConnections: videoInput2]; –

+6

Funktioniert nicht unter iOS 10 - das Hinzufügen der zweiten Eingabe zur Sitzung schlägt fehl: Beenden der App aufgrund der nicht abgefangenen Ausnahme 'NSInvalidArgumentException', Grund: '*** - [AVCaptureSession addInputWithNoConnections:] Mehrere AVCaptureInputs für Audio/Video werden derzeit nicht unterstützt –

Verwandte Themen