【发布时间】:2017-10-03 19:11:21
【问题描述】:
我目前正在积极研究这一点,但现在 iPhone 7 Plus 具有双摄像头系统,AVFoundation 是否允许您同时处理来自每个特定摄像头的视频帧?
我正在考虑/希望在给定特定位置的情况下,我能够同时处理来自两个 AVCaptureDevice 实例的输出。
【问题讨论】:
标签: ios avfoundation
我目前正在积极研究这一点,但现在 iPhone 7 Plus 具有双摄像头系统,AVFoundation 是否允许您同时处理来自每个特定摄像头的视频帧?
我正在考虑/希望在给定特定位置的情况下,我能够同时处理来自两个 AVCaptureDevice 实例的输出。
【问题讨论】:
标签: ios avfoundation
您一次只能将一台摄像机添加到 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。它允许您同时拍摄两张静止图像,但是,没有流媒体/视频。
【讨论】:
在更新的 AVFoundation 文档 (AVCaptureDeviceType) 中有新的设备类型:builtInWideAngleCamera 和 builtInTelephotoCamera。因此,应该可以创建多个捕获会话并同时从它们两个获取反馈。
【讨论】:
-startRunning 将停止第一个。