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. Это позволяет одновременно снимать два неподвижных изображения, но не потоковое/видео.