iOS上的双AVCaptureSession输出

Abe*_*bel 5 objective-c avfoundation ios avcapturesession

我正试图在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];
    }

}
Run Code Online (Sandbox Code Playgroud)

但是当应用程序启动前置摄像头的会话时,后置摄像头的会话将停止并留下静止图像.

有没有办法实时显示两个摄像机的输出?

谢谢

los*_*sit 2

不,这不对。使用 AVCaptureSession 时,一次只能使用一个摄像机源。

不允许同时使用多个 AVCaptureInput。因此,一旦一个会话开始,另一个会话就会停止。

最好的选择是创建两个会话,启动第一个会话,一旦报告帧,就停止它并启动第二个会话。然后停止第二个并开始第一个,继续这样做。这可行,但您收到的输入会有明显的延迟。

  • 我认为最好只让一个会话始终运行并使用 [AVsession beginConfiguration] 切换摄像头;[AVsession addInput:inputCam]; [AVsession提交配置]; 但你仍然会有一些延迟 (2认同)