IPhone 7 Plus - AVFoundation dual camera
Я активно изучаю это на данный момент, но теперь, когда iPhone 7 Plus имеет систему с двумя камерами, AVFoundation позволит вам одновременно обрабатывать видеокадры с каждой конкретной камеры?
Я думаю/надеюсь, что смогу обрабатывать выходные данные из двух экземпляров AVCaptureDevice
одновременно с определенной позицией.
Ответы
Ответ 1
В обновленной документации AVFoundation
(AVCaptureDeviceType) появляются новые типы устройств: builtInWideAngleCamera
и builtInTelephotoCamera
. Следовательно, должно быть возможно создать несколько сеансов захвата и получить обратную связь от обоих из них в одно и то же время.
Ответ 2
Вы можете добавить только одну камеру в то время к 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];
}
Если вы этого не сделаете или сохраните свой старый код, вы будете использовать только широкую камеру, даже если вы увеличиваете масштаб.
EDIT: в iOS 11 есть новая функция AVCapturePhotoSettings, называемая dualCameraDualPhotoDeliveryEnabled. Это позволяет одновременно снимать два неподвижных изображения, но не потоковое/видео.