【问题标题】:iPhone 7+, ios 11.2: Depth data delivery is not supported in the current configurationiPhone 7+、ios 11.2:当前配置不支持深度数据传输
【发布时间】:2018-03-15 14:26:58
【问题描述】:

这个错误快把我逼疯了。我正在尝试使用其 DualCam 从 iPhone 7+ 生成绝对最小的代码以获取 AVDepthData

我有这个代码:

// // RecorderViewController.swift // ios-recorder-app import UIKit import AVFoundation class RecorderViewController: UIViewController { @IBOutlet weak var previewView: UIView! @IBAction func onTapTakePhoto(_ sender: Any) { guard let capturePhotoOutput = self.capturePhotoOutput else { return } let photoSettings = AVCapturePhotoSettings() photoSettings.isDepthDataDeliveryEnabled = true //Error capturePhotoOutput.capturePhoto(with: photoSettings, delegate: self) } var session: AVCaptureSession? var videoPreviewLayer: AVCaptureVideoPreviewLayer? var capturePhotoOutput: AVCapturePhotoOutput? override func viewDidLoad() { super.viewDidLoad() AVCaptureDevice.requestAccess(for: .video, completionHandler: { _ in }) let captureDevice = AVCaptureDevice.default(.builtInDualCamera, for: .depthData, position: .back) do { print(captureDevice!) let input = try AVCaptureDeviceInput(device: captureDevice!) self.capturePhotoOutput = AVCapturePhotoOutput() self.capturePhotoOutput?.isDepthDataDeliveryEnabled = true //Error self.session = AVCaptureSession() self.session?.addInput(input) self.videoPreviewLayer = AVCaptureVideoPreviewLayer(session: self.session!) self.videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill self.videoPreviewLayer?.frame = view.layer.bounds previewView.layer.addSublayer(self.videoPreviewLayer!) self.session?.addOutput(self.capturePhotoOutput!) self.session?.startRunning() } catch { print(error) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } extension RecorderViewController : AVCapturePhotoCaptureDelegate { func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { print(photo.depthData) } }

如果我注释掉标有“错误”的行,代码将按预期工作,并为depthData 打印nil

但是,保持原样,我得到一个例外。错误消息指出:AVCapturePhotoOutput setDepthDataDeliveryEnabled:] Depth data delivery is not supported in the current configuration

如何更改“当前配置”以支持深度交付?

我看过这个视频:https://developer.apple.com/videos/play/wwdc2017/507/,这很有帮助,我相信我已经按照完成这项工作所需的确切步骤。

任何提示将不胜感激!

【问题讨论】:

  • 使用var photoSettings 而不是let photoSettings
  • 我将每次使用 let 更改为 var 并且异常仍然发生。在这个阶段似乎发生了:self.capturePhotoOutput?.isDepthDataDeliveryEnabled = true //Error

标签: ios swift avcapturesession avcapturedevice avcaptureoutput


【解决方案1】:

有两件事我需要解决。

  1. sessionPreset 设置为支持深度的格式,例如.photo
  2. 在设置.isDepthDataDeliveryEnabled = true之前将cameraPhotoOutput添加到会话中。

这是我获取照片深度的最小代码:

// // RecorderViewController.swift // ios-recorder-app // import UIKit import AVFoundation class RecorderViewController: UIViewController { @IBOutlet weak var previewView: UIView! @IBAction func onTapTakePhoto(_ sender: Any) { guard var capturePhotoOutput = self.capturePhotoOutput else { return } var photoSettings = AVCapturePhotoSettings() photoSettings.isDepthDataDeliveryEnabled = true capturePhotoOutput.capturePhoto(with: photoSettings, delegate: self) } var session: AVCaptureSession? var videoPreviewLayer: AVCaptureVideoPreviewLayer? var capturePhotoOutput: AVCapturePhotoOutput? override func viewDidLoad() { super.viewDidLoad() AVCaptureDevice.requestAccess(for: .video, completionHandler: { _ in }) let captureDevice = AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .back) print(captureDevice!.activeDepthDataFormat) do{ let input = try AVCaptureDeviceInput(device: captureDevice!) self.capturePhotoOutput = AVCapturePhotoOutput() self.session = AVCaptureSession() self.session?.beginConfiguration() self.session?.sessionPreset = .photo self.session?.addInput(input) self.videoPreviewLayer = AVCaptureVideoPreviewLayer(session: self.session!) self.videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill self.videoPreviewLayer?.frame = self.view.layer.bounds self.previewView.layer.addSublayer(self.videoPreviewLayer!) self.session?.addOutput(self.capturePhotoOutput!) self.session?.commitConfiguration() self.capturePhotoOutput?.isDepthDataDeliveryEnabled = true self.session?.startRunning() } catch{ print(error) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } extension RecorderViewController : AVCapturePhotoCaptureDelegate { func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { print(photo.depthData) } }

【讨论】:

  • 非常感谢您的回答。但是,我发现如果我在self.session?.addOutput(self.capturePhotoOutput!) 之前写self.capturePhotoOutput?.isDepthDataDeliveryEnabled = true,应用程序会在说-[AVCapturePhotoOutput setDepthDataDeliveryEnabled:] Depth data delivery is not supported in the current configuration' 时崩溃。你知道为什么会这样吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多