iPhone 7 Plus - AVFoundation 双摄像头

iPhone 7 Plus - AVFoundation dual camera

我目前正在积极研究这个问题,但既然 iPhone 7 Plus 有双摄像头系统,AVFoundation 是否允许您同时处理来自每个特定摄像头的视频帧?

我 thinking/hoping 我能够在给定特定位置的情况下同时处理来自两个 AVCaptureDevice 实例的输出。

在更新的 AVFoundation 文档 (AVCaptureDeviceType) 中有新的设备类型:builtInWideAngleCamerabuiltInTelephotoCamera。因此,应该可以创建多个捕获会话并同时从他们两个那里获得反馈。

您一次只能将一个摄像头添加到一个 AVCaptureSession。例如,您可以在前置和后置摄像头之间切换,但不能同时使用两者。 7 Plus上的两个后置摄像头也是一样,你必须选择其中一个。但是,有一个小区别,因为您还可以调用 "duo camera" 在缩放时合并来自两个摄像头的图像。但这仅适用于静态照片,您将只能获得一个 image/capture 缓冲区。对于视频,您必须选择任一摄像头。

要选择相机,您可以使用新的 AVCaptureDeviceDiscoverySession。要使用双摄像头:

@property (nonatomic) AVCaptureDevice *backCamera;
@property (nonatomic) AVCaptureDeviceInput *backCameraInput;


if([AVCaptureDeviceDiscoverySession class]){
    NSArray *allTypes = @[AVCaptureDeviceTypeBuiltInDuoCamera, AVCaptureDeviceTypeBuiltInWideAngleCamera, AVCaptureDeviceTypeBuiltInTelephotoCamera ];
    AVCaptureDeviceDiscoverySession *discoverySession = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:allTypes mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionBack];

    for(AVCaptureDevice *device in discoverySession.devices) {
        if(device.deviceType== AVCaptureDeviceTypeBuiltInDuoCamera){
            self.backCamera = device;
            self.backCameraInput = [AVCaptureDeviceInput deviceInputWithDevice:self.backCamera error:&error];
        }
    }
}

if(!self.backCamera){
    self.backCamera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    self.backCameraInput = [AVCaptureDeviceInput deviceInputWithDevice:self.backCamera error:&error];
}

分别使用广角和长焦相机

@property (nonatomic) AVCaptureDevice *backCamera;
@property (nonatomic) AVCaptureDeviceInput *backCameraInput;
@property (nonatomic) AVCaptureDevice *teleCamera;
@property (nonatomic) AVCaptureDeviceInput *teleCameraInput;


if([AVCaptureDeviceDiscoverySession class]){
    NSArray *allTypes = @[AVCaptureDeviceTypeBuiltInDuoCamera, AVCaptureDeviceTypeBuiltInWideAngleCamera, AVCaptureDeviceTypeBuiltInTelephotoCamera ];
    AVCaptureDeviceDiscoverySession *discoverySession = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:allTypes mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionBack];

    for(AVCaptureDevice *device in discoverySession.devices) {
        if(device.deviceType==AVCaptureDeviceTypeBuiltInWideAngleCamera){
            self.backCamera = device;
            self.backCameraInput = [AVCaptureDeviceInput deviceInputWithDevice:self.backCamera error:&error];
        }

        if(device.deviceType==AVCaptureDeviceTypeBuiltInTelephotoCamera){
            self.teleCamera = device;
            self.teleCameraInput = [AVCaptureDeviceInput deviceInputWithDevice:self.teleCamera error:&error];
        }
    }
}

if(!self.backCamera){
    self.backCamera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    self.backCameraInput = [AVCaptureDeviceInput deviceInputWithDevice:self.backCamera error:&error];
}

如果您不这样做,或者保留您的旧代码,即使您进行缩放,您也只能使用广角镜头。

编辑:在 iOS11 中有一个名为 dualCameraDualPhotoDeliveryEnabled 的新 AVCapturePhotoSettings。它允许您同时拍摄两张静止图像,但是,没有 streaming/video.