Подтвердить что ты не робот

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

Какие-нибудь полезные идеи о потоке с обеих камер?

4b9b3361

Ответ 1

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

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

Сделайте НЕ добавление выходов следующим образом:

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