Я пытаюсь сделать снимок с обеих камер на устройстве iOS одновременно. Я также хотел бы иметь предварительный просмотр обеих камер на экране. Я использую этот код:

- (void)prepareCameraView:(UIView *)window
{
    NSArray *captureDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];

    {
        AVCaptureSession *session = [[AVCaptureSession alloc] init];
        session.sessionPreset = AVCaptureSessionPresetMedium;

        CALayer *viewLayer = window.layer;
        NSLog(@"viewLayer = %@", viewLayer);

        AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
        captureVideoPreviewLayer.frame = CGRectMake(0.0f, 0.0f, window.bounds.size.width/2.0f, window.bounds.size.height);
        [window.layer addSublayer:captureVideoPreviewLayer];

        NSError *error = nil;
        AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:[captureDevices objectAtIndex:0] error:&error];
        if (!input)
        {
            NSLog(@"ERROR : trying to open camera : %@", error);
        }

        [session addInput:input];

        [session startRunning];
    }

    {
        AVCaptureSession *session = [[AVCaptureSession alloc] init];
        session.sessionPreset = AVCaptureSessionPresetMedium;

        CALayer *viewLayer = window.layer;
        NSLog(@"viewLayer = %@", viewLayer);

        AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
        captureVideoPreviewLayer.frame = CGRectMake(window.bounds.size.width/2.0f, 0.0f, window.bounds.size.width/2.0f, window.bounds.size.height);
        [window.layer addSublayer:captureVideoPreviewLayer];

        NSError *error = nil;
        AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:[captureDevices objectAtIndex:1] error:&error];
        if (!input)
        {
            NSLog(@"ERROR : trying to open camera : %@", error);
        }

        [session addInput:input];

        [session startRunning];
    }

}

Но когда приложение запускает сеанс для передней камеры, сеанс задней камеры останавливается и оставляет неподвижное изображение.

Есть ли способ отображать изображение с обеих камер в реальном времени?

Благодарность

5
Abel 16 Мар 2013 в 15:01

1 ответ

Лучший ответ

Нет, это не так. При использовании AVCaptureSession одновременно можно использовать только один канал камеры.

Использование нескольких AVCaptureInput одновременно не допускается. Итак, как только начинается одно занятие, другое прекращается.

Лучше всего создать два сеанса, запустить первый и, как только он сообщит о кадре, остановить его и запустить второй. Затем остановите вторую и начните первую, продолжайте делать это. Это будет работать, но во входных данных, которые вы получаете, будет заметная задержка.

2
lostInTransit 16 Мар 2013 в 15:33
Хорошо, но можно ли сфотографировать обе камеры без предварительного просмотра в реальном времени?
 – 
Abel
16 Мар 2013 в 15:30
2
Я думаю, что лучше иметь только один сеанс, работающий все время, и переключать камеру с помощью [AVsession beginConfiguration]; [AVsession addInput: inputCam]; [Конфигурация фиксации AVsession]; Хотя у вас все еще будет некоторая задержка
 – 
Sten
16 Мар 2013 в 20:10
Хотя это может сработать, я вижу, что это решение настолько медленное, что его нельзя использовать. Лучшее решение - использовать AVCaptureVideoDataOutput и рисовать вывод с помощью AVCaptureVideoDataOutputSampleBufferDelegate. Это решение подробно описано здесь: stackoverflow.com/questions/ 16543075 /…
 – 
Johnny
7 Авг 2014 в 22:24