2012-06-17 13 views
13

Desidero visualizzare lo stream della fotocamera anteriore e posteriore di un iPad2 in due UIViews uno accanto all'altro. Per eseguire lo streaming l'immagine di un dispositivo che uso il seguente codiceEseguire più AVCaptureSessions o aggiungere più input

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

che funziona bene per entrambi macchina fotografica. Per visualizzare lo stream in parallelo, ho provato a creare un'altra sessione, ma non appena viene stabilita la seconda sessione, il primo si blocca.

Quindi ho provato ad aggiungere due AVCaptureDeviceInput alla sessione ma sembra che al momento sia supportato un solo input.

Qualche idea utile su come trasmettere in streaming da entrambe le telecamere?

+0

possibile duplicato di [Come posso ottenere l'autofocus per funzionare in una seconda sessione AVCaptureSession senza ricreare le sessioni?] (Http://stackoverflow.com/questions/5427561/how-can-i-get-autofocus-to-work -in-a-second-avcapturesession-without-recreating) –

risposta

13

E è possibile ottenere CMSampleBufferRef s da più dispositivi video su MacOS X. È necessario impostare i AVCaptureConnection oggetti manualmente. Per esempio, supponendo che si dispone di questi oggetti:

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

fare NON aggiungere le uscite in questo modo:

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

Invece, li Aggiungi dire la sessione di non effettuare i collegamenti:

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

Quindi per ogni coppia di input/output effettuare la connessione dalla porta video dell'ingresso all'uscita manualmente:

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

Infine, assicurarsi di impostare i delegati tampone campione per entrambe le uscite:

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

e ora si dovrebbe essere in grado di elaborare i frame da entrambi i dispositivi:

- (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 anche il AVVideoWall sample project per un esempio di combinazione di anteprime live da più dispositivi video.

+0

Grazie a questo ha funzionato per me con un'aggiunta. Ho anche dovuto fare: [session addInputWithNoConnections: videoInput1]; [session addInputWithNoConnections: videoInput2]; –

+6

Non funziona su iOS 10 - l'aggiunta del secondo input alla sessione non riesce: interruzione dell'app a causa dell'eccezione non rilevata 'NSInvalidArgumentException', motivo: '*** - [AVCaptureSession addInputWithNoConnections:] AVCaptureInput multipli audio/video non sono attualmente supportati –

Problemi correlati