__availableRawPhotoPixelFormatTypes пусто на iPhone 7+ и iOS11
Я пытаюсь захватить RAW файлы с помощью AVFoundation. Однако я получаю пустой массив в __availableRawPhotoPixelFormatTypes
Вот мой фрагмент
if self._photoOutput == nil {
self._photoOutput = AVCapturePhotoOutput()
print(self._photoOutput!.__availableRawPhotoPixelFormatTypes)
}
И вывод пустой массив []
Что может вызвать это?
2 ответа
Вот три вещи, которые вызовут availableRawPhotoPixelFormatTypes
массив должен быть пустым:
Вы читаете
availableRawPhotoPixelFormatTypes
свойство перед добавлением вашего_photoOutput
дляAVCaptureSession
с источником видео.Вы используете двойной вход камеры. Если это так, вы не можете захватывать изображения в формате RAW.
Вы используете фронтальную камеру. Если это так, вы не можете захватывать изображения в формате 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
тоже будет пусто.