iPhone 7 Plus - AVFoundation双摄像头

17

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

我认为/希望我能够在特定位置同时处理两个AVCaptureDevice实例的输出。

2个回答

14

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

要选择相机,请使用新的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];
}

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

编辑:在iOS 11中,有一个名为dualCameraDualPhotoDeliveryEnabled的新AVCapturePhotoSettings。它允许您同时拍摄两张静态图像,但没有流媒体/视频。


7

在更新的 AVFoundation 文档中(AVCaptureDeviceType),新增了两种设备类型:builtInWideAngleCamerabuiltInTelephotoCamera。因此,可以创建多个捕获会话并同时获取它们的反馈。


1
那是否意味着我们可以分别从这两个相机中获得不同的图像? 实际上,这是我应用程序的一个要求,所以如果有人能回答我的问题,那将是一个很大的帮助。 提前致谢。 - Satish Mavani
2
我非常确定你不能同时从两个摄像头输出视频数据流。如果你创建了多个捕获会话,调用第二个会话的“-startRunning”方法将停止第一个会话。 - Kevin Chen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接