Не удается сделать двойное фото с двойной камеры на iPhone X

Я пытаюсь одновременно снимать как с телеобъектива, так и с широкоугольной камеры на iPhoneX. Вот как я инициализировал устройство:

let captureDevice = AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .back)

и я запросил двойную доставку фотографий для AVPhotoOutput:

let photoSettings = AVCapturePhotoSettings()

photoSettings.isDualCameraDualPhotoDeliveryEnabled = true

capturePhotoOutput.capturePhoto(with: photoSettings, delegate: self)

Однако я сталкиваюсь с этой ошибкой:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[AVCapturePhotoOutput setDualCameraDualPhotoDeliveryEnabled:] Dual Camera dual photo delivery is not supported in this configuration'

Есть ли дополнительные настройки, которые мне нужно включить или отключить?


person user1155386    schedule 11.11.2017    source источник
comment
Вы нашли решение этой проблемы?   -  person Kartick Vaddadi    schedule 06.01.2018
comment
Неа. Вы столкнулись с той же проблемой?   -  person user1155386    schedule 08.01.2018
comment
возможно, вам нужно изменить некоторые другие параметры, например, установить для свойств isAutoDualCameraFusionEnabled и isAutoStillImageStabilizationEnabled значение false, а для свойства flashMode — отключить, а также потенциально изменить запрошенный размер фотографии.   -  person twerdster    schedule 16.01.2018
comment
та же проблема :( Я действительно не знаю, что с этим делать ... есть идеи?   -  person martinpristas    schedule 28.02.2018


Ответы (1)


Вы должны убедиться, что ваше устройство захвата, сеанс захвата и вывод захвата настроены правильно:

  1. Получите устройство захвата, используя следующие настройки (которые уже корректны в вашем коде): AVCaptureDeviceTypeBuiltInDualCamera, AVMediaTypeVideo, AVCaptureDevicePositionBack

  2. Создайте AVCaptureDeviceInput, используя устройство, которое вы только что получили в 1.

  3. Создайте AVCaptureSession и установите для его sessionPreset значение AVCaptureSessionPresetPhoto.
  4. Создать AVCapturePhotoOutput
  5. Добавьте созданные AVCaptureDeviceInput и AVCapturePhotoOutput в AVCaptureSession.
  6. Установите для параметра dualCameraDualPhotoDeliveryEnabled вашего AVCapturePhotoOutput значение YES.
  7. Начать сеанс захвата

Соответствующий код (Objective-C):

// Create capture device discovery session to retrieve devices matching our
// needs
// -------------------------------------------------------------------------------
AVCaptureDeviceDiscoverySession*    captureDeviceDiscoverySession = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInDualCamera]
                                                                                                                           mediaType:AVMediaTypeVideo
                                                                                                                            position:AVCaptureDevicePositionBack];

// Loop through the retrieved devices and select correct one
// -------------------------------------------------------------------------------
for(AVCaptureDevice* device in [captureDeviceDiscoverySession devices])
{
    if(device.position == AVCaptureDevicePositionBack)
    {
        self.captureDevice = device;
        break;
    }
}

// Get camera input
// -------------------------------------------------------------------------------
NSError*                error               = nil;
AVCaptureDeviceInput*   videoDeviceInput    = [AVCaptureDeviceInput deviceInputWithDevice:self.captureDevice error:&error];

if(!videoDeviceInput)
{
    NSLog(@"Could not retrieve camera input, error: %@", error);
    return;
}

// Initialize capture session
// -------------------------------------------------------------------------------   
self.captureSession                 = [[AVCaptureSession alloc] init];
self.captureSession.sessionPreset   = AVCaptureSessionPresetPhoto;

// Add video device input and photo data output to our capture session
// -------------------------------------------------------------------------------
self.captureOutput  = [AVCapturePhotoOutput new];
[self.captureSession beginConfiguration];
if(![self.captureSession canAddOutput:self.captureOutput])
{
    NSLog(@"Cannot add photo output!");
    return;
}

[self.captureSession addInput:videoDeviceInput];
[self.captureSession addOutput:self.captureOutput];
[self.captureSession commitConfiguration];

// Configure output settings AFTER input & output have been added to the session
// -------------------------------------------------------------------------------
if(self.captureOutput.isDualCameraDualPhotoDeliverySupported)
    self.captureOutput.dualCameraDualPhotoDeliveryEnabled = YES;

// Create video preview layer for this session, and add it to our preview UIView
// -------------------------------------------------------------------------------
AVCaptureVideoPreviewLayer* videoPreviewLayer   = [AVCaptureVideoPreviewLayer layerWithSession:self.captureSession];
videoPreviewLayer.videoGravity                  = AVLayerVideoGravityResizeAspect;
videoPreviewLayer.frame                         = self.view.bounds;
[self.view.layer addSublayer:videoPreviewLayer];

// Start capturing session
// -------------------------------------------------------------------------------
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    [self.captureSession startRunning];
});
  1. Позже для каждой фотографии, которую вы будете запрашивать из AVCapturePhotoOutput, используйте AVCapturePhotoSettings с параметром dualCameraDualPhotoDeliveryEnabled, установленным в YES.

Код (Цель-C):

AVCapturePhotoSettings* settings = [AVCapturePhotoSettings photoSettingsWithFormat:@{AVVideoCodecKey: AVVideoCodecTypeJPEG}];
settings.dualCameraDualPhotoDeliveryEnabled = YES;
[self.captureOutput capturePhotoWithSettings:settings delegate:self];
person RodKik    schedule 28.03.2019