Я следовал Захват фотографий с глубиной и рассмотрел каждое предложение в аналогичный вопрос , однако я не могу получить данные о глубине с моей пользовательской камеры.Вот мое последнее изменение в коде, вы имеете какое-либо представление об этой проблеме?
, когда я нажимаю кнопку камеры, я получаю:
libc ++ abi.dylib: прекращениес неисследованным исключением типа NSException
Я также рассмотрел решения для этого.Они в основном связаны с переходом, но я дважды проверил эту часть кода и раскадровки, и это кажется нормальным.(У меня не было проблем до добавления глубины в код!)
class CameraViewController : UIViewController {
@IBOutlet weak var cameraButton: UIButton!
var captureSession = AVCaptureSession()
var captureDevice: AVCaptureDevice?
var photoOutput: AVCapturePhotoOutput?
var cameraPreviewLayer: AVCaptureVideoPreviewLayer?
var image: UIImage?
var depthDataMap: CVPixelBuffer?
var depthData: AVDepthData?
override func viewDidLoad() {
super.viewDidLoad()
setupDevice()
setupIO()
setupPreviewLayer()
startRunningCaptureSession()
}
func setupDevice() {
self.captureDevice = AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .back)
}
func setupIO() {
guard let captureInputDevice = try? AVCaptureDeviceInput(device: self.captureDevice!),
self.captureSession.canAddInput(captureInputDevice)
else { fatalError("Can't add video input.") }
self.captureSession.beginConfiguration()
self.captureSession.addInput(captureInputDevice)
self.photoOutput = AVCapturePhotoOutput()
self.photoOutput!.isDepthDataDeliveryEnabled = photoOutput!.isDepthDataDeliverySupported
guard self.captureSession.canAddOutput(photoOutput!)
else { fatalError("Can't add photo output.") }
self.captureSession.addOutput(photoOutput!)
self.captureSession.sessionPreset = .photo
self.captureSession.commitConfiguration()
}
func setupPreviewLayer() {
self.cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession)
self.cameraPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
self.cameraPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
self.cameraPreviewLayer?.frame = self.view.frame
self.view.layer.insertSublayer(self.cameraPreviewLayer!, at: 0)
}
func startRunningCaptureSession() {
self.captureSession.startRunning()
}
@IBAction func cameraButtonDidTap(_ sender: Any) {
let setting = AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecType.hevc])
setting.isDepthDataDeliveryEnabled = self.photoOutput!.isDepthDataDeliverySupported
self.photoOutput?.capturePhoto(with: setting, delegate: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showPhoto" {
let nav = segue.destination as! UINavigationController
let previewVC = nav.topViewController as! PhotoViewController
previewVC.image = self.image
previewVC.depthData = self.depthData
previewVC.depthDataMap = self.depthDataMap
}
}
}
extension CameraViewController: AVCapturePhotoCaptureDelegate{
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
if let imageData = photo.fileDataRepresentation() {
image = UIImage(data: imageData)
let imageSource = CGImageSourceCreateWithData(imageData as CFData, nil)
let auxiliaryData = CGImageSourceCopyAuxiliaryDataInfoAtIndex(imageSource!, 0, kCGImageAuxiliaryDataTypeDisparity) as? [AnyHashable: Any]
let depthData = try? AVDepthData(fromDictionaryRepresentation: auxiliaryData!)
self.depthDataMap = depthData?.depthDataMap
self.performSegue(withIdentifier: "showPhoto", sender: self)
}
}
}