__availableRawPhotoPixelFormatTypes пусто на iPhone 7+ и iOS11

Я пытаюсь захватить RAW файлы с помощью AVFoundation. Однако я получаю пустой массив в __availableRawPhotoPixelFormatTypes

Вот мой фрагмент

if self._photoOutput == nil {
    self._photoOutput = AVCapturePhotoOutput()
    print(self._photoOutput!.__availableRawPhotoPixelFormatTypes)
}

И вывод пустой массив []

Что может вызвать это?

2 ответа

Вот три вещи, которые вызовут availableRawPhotoPixelFormatTypes массив должен быть пустым:

  1. Вы читаете availableRawPhotoPixelFormatTypes свойство перед добавлением вашего _photoOutput для AVCaptureSession с источником видео.

  2. Вы используете двойной вход камеры. Если это так, вы не можете захватывать изображения в формате RAW.

  3. Вы используете фронтальную камеру. Если это так, вы не можете захватывать изображения в формате RAW.

Вот пример измененного кода из превосходного руководства Apple (см. Ссылку ниже). Я скопировал из нескольких мест и немного обновил его для краткости, простоты и лучшего обзора:

let session = AVCaptureSession()
let photoOutput = AVCapturePhotoOutput()

private func configureSession() {
    // Get camera device.
    guard let videoCaptureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) else {
        print("Unable to get camera device.")
        return
    }
    // Create a capture input.
    guard let videoInput = try? AVCaptureDeviceInput(device: videoCaptureDevice) else {
        print("Unable to obtain video input for default camera.")
        return
    }

    // Make sure inputs and output can be added to session.
    guard session.canAddInput(videoInput) else { return }
    guard session.canAddOutput(photoOutput) else { return }

    // Configure the session.
    session.beginConfiguration()
    session.sessionPreset = .photo
    session.addInput(videoInput)
    // availableRawPhotoPixelFormatTypes is empty.
    session.addOutput(photoOutput)
    // availableRawPhotoPixelFormatTypes should not be empty.
    session.commitConfiguration()
}

private func capturePhoto() {
    // Photo settings for RAW capture.
    let rawFormatType = kCVPixelFormatType_14Bayer_RGGB
    // At this point the array should not be empty (session has been configured).
    guard photoOutput.availableRawPhotoPixelFormatTypes.contains(NSNumber(value: rawFormatType).uint32Value) else {
        print("No available RAW pixel formats")
        return
    }

    let photoSettings = AVCapturePhotoSettings(rawPixelFormatType: rawFormatType)
    photoOutput.capturePhoto(with: photoSettings, delegate: self)
}

// MARK: - AVCapturePhotoCaptureDelegate methods

func photoOutput(_ output: AVCapturePhotoOutput,
                 didFinishProcessingRawPhoto rawSampleBuffer: CMSampleBuffer?,
                 previewPhoto previewPhotoSampleBuffer: CMSampleBuffer?,
                 resolvedSettings: AVCaptureResolvedPhotoSettings,
                 bracketSettings: AVCaptureBracketedStillImageSettings?,
                 error: Error?) {
    guard error == nil, let rawSampleBuffer = rawSampleBuffer else {
        print("Error capturing RAW photo:\(error)")
        return
    }
    // Do something with the rawSampleBuffer.
}

Руководство по захвату фотографий Apple: https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/PhotoCaptureGuide/index.html

availableRawPhotoPixelFormatTypesсвойство: https://developer.apple.com/documentation/avfoundation/avcapturephotooutput/1778628-availablerawphotopixelformattype)

Возможности камеры iPhone: https://developer.apple.com/library/content/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/Cameras/Cameras.html

Одна поставка к ответу @Thomas:

Если вы измените AVCaptureDevice.activeFormat, AVCaptureSession.sessionPresetбудет установлен на inputPriorityавтоматически. В такой ситуации availableRawPhotoPixelFormatTypesтоже будет пусто.

Другие вопросы по тегам