Запустите несколько AVCaptureSessions или добавьте несколько входов

Я хочу отобразить поток передней и задней камер iPad2 в двух UIViews рядом друг с другом. Для потоковой передачи изображения одного устройства я использую следующий код

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 в сеанс, но кажется, что в данный момент поддерживается не более одного входа.

Любые полезные идеи, как для потоковой передачи с обеих камер?

 Gabriele Petronella25 окт. 2013 г., 17:50

Ответы на вопрос(1)

Этоis можно получитьCMSampleBufferRefс нескольких видеоустройств на MacOS X. Вы должны настроитьAVCaptureConnection объекты вручную. Например, если у вас есть эти объекты:

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

ДелатьNOT добавьте результаты как это:

[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 пример проекта для примера объединения предварительных просмотров с нескольких видеоустройств.

 18 дек. 2016 г., 05:37
Не работает на iOS 10 & # x2014; не удается добавить второй вход в сеанс: завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «*** - [AVCaptureSession addInputWithNoConnections:] Несколько аудио / видео AVCaptureInputs в настоящее время не поддерживаются
 09 дек. 2016 г., 04:59
Спасибо, это сработало для меня с одним дополнением. Я также должен был сделать: [session addInputWithNoConnections: videoInput1]; [session addInputWithNoConnections: videoInput2];

Ваш ответ на вопрос