ios - 如何在 iOS 上获取相机校准数据?又名 AVCameraCalibrationData
问题描述
我正在开发一个需要AVCameraCalibrationData
. 我的应用程序崩溃并出现异常。
AVCaptureDataOutputSynchronizer initWithDataOutputs:] Unsupported AVCaptureOutput in dataOutputs - <AVCapturePhotoOutput: 0x283d6ab80>'
我尝试了其他一些解决方法,但depthDataOutput
没有被调用。请看我的相机configuration
。任何帮助将非常感激。
class ViewController: UIViewController {
@IBOutlet var image_view: UIImageView!
@IBOutlet var capture_button: UIButton!
var captureSession: AVCaptureSession?
var sessionOutput: AVCapturePhotoOutput?
var depthOutput: AVCaptureDepthDataOutput?
var previewLayer: AVCaptureVideoPreviewLayer?
var outputSynchronizer: AVCaptureDataOutputSynchronizer?
let dataOutputQueue = DispatchQueue(label: "data queue", qos: .userInitiated, attributes: [], autoreleaseFrequency: .workItem)
@IBAction func capture(_ sender: Any) {
self.sessionOutput?.capturePhoto(with: AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecType.jpeg]), delegate: self)
}
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
self.previewLayer?.removeFromSuperlayer()
self.image_view.image = UIImage(data: photo.fileDataRepresentation()!)
print(photo.cameraCalibrationData) // is nil
let depth_map = photo.depthData?.depthDataMap
print("depth_map:", depth_map) // is nil
}
func depthDataOutput(_ output: AVCaptureDepthDataOutput, didOutput depthData: AVDepthData, timestamp: CMTime, connection: AVCaptureConnection) {
print("depth data") // never called
}
override func viewDidLoad() {
super.viewDidLoad()
self.captureSession = AVCaptureSession()
self.captureSession?.sessionPreset = .photo
self.sessionOutput = AVCapturePhotoOutput()
self.depthOutput = AVCaptureDepthDataOutput()
self.depthOutput?.setDelegate(self, callbackQueue: dataOutputQueue)
do {
let device = AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .back)
let input = try AVCaptureDeviceInput(device: device!)
if(self.captureSession?.canAddInput(input))!{
self.captureSession?.addInput(input)
if(self.captureSession?.canAddOutput(self.sessionOutput!))!{
self.captureSession?.addOutput(self.sessionOutput!)
if(self.captureSession?.canAddOutput(self.depthOutput!))!{
self.captureSession?.addOutput(self.depthOutput!)
self.previewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession!)
self.previewLayer?.frame = self.image_view.bounds
self.previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
self.previewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
self.image_view.layer.addSublayer(self.previewLayer!)
}
}
}
if sessionOutput!.isDepthDataDeliverySupported {
sessionOutput?.isDepthDataDeliveryEnabled = true
depthOutput?.connection(with: .depthData)!.isEnabled = true
depthOutput?.isFilteringEnabled = true
outputSynchronizer = AVCaptureDataOutputSynchronizer(dataOutputs: [sessionOutput!, depthOutput!]) // app crash on that line of code
outputSynchronizer!.setDelegate(self, queue: self.dataOutputQueue)
}
} catch {}
self.captureSession?.startRunning()
}
}
@available(iOS 11.0, *)
extension ViewController: AVCaptureDataOutputSynchronizerDelegate , AVCaptureDepthDataOutputDelegate, AVCapturePhotoCaptureDelegate {
@available(iOS 11.0, *)
func dataOutputSynchronizer(_ synchronizer: AVCaptureDataOutputSynchronizer, didOutput synchronizedDataCollection: AVCaptureSynchronizedDataCollection) {
}
}
解决方案
推荐阅读
- java - Jboss EAP 7.0.9 中的 RichFaces 4.3.7:IllegalStateException
- ios - 如何更快地优化将视频保存到相册?
- matlab - 读取每第 n 行数据,读取条件后的所有行
- algorithm - 是否有稀疏编辑距离算法?
- javascript - 具有多个精确单击处理程序的 Vue 元素在使用系统修饰符单击时始终执行 click.exact 方法
- gcc - 将 llvm 生成的目标代码与 ld 链接
- gradle - 如何在 Gradle 中为所有源集创建公共 processResources
- android - Android studio - 字母语音识别
- google-api - Gmail 轮询和身份验证
- angular - Angular 6 应用程序找不到命名空间“google”