如何同时委托ARSession和AVCaptureSession?

How to delegate ARSession and AVCaptureSession at the same time?

我见过有人 运行使用 ARSCNView 使用 ARKit,他们能够在相机中获取所说的二维码矩形,并在与该地点相关的位置渲染某些东西QR 码驻留在 space。我以为他们是通过委托 AVCaptureMetadataOutputObjectsDelegate 来做到的,所以我继续尝试实现以下逻辑:

  1. 运行 ARSCNViewDelegate, ARSessionDelegateAVCaptureMetadataOutputObjectsDelegate 同时出现。

  2. 连接 ARSCNView,将视图及其会话委托给自己。

  3. 连接一个 AVCaptureSession,将其委托给自己,然后开始会话。

  4. 开始ARSCNView会话,因为官方的例子在viewWillAppear()中是这样做的,我也是这样做的

应用程序执行 运行 没有任何错误,但我只能从 AVCaptureMetadataOutputObjectsDelegate 获得一些回调,比如 3 到 5,然后它再也不会像 [= 的委托那样被调用=20=] 夺取了它的权限,是我实施了错误的方法还是你不能同时委托 ARSessionAVCaptureSession

我完全按照你的描述做了,也遇到了同样的问题。似乎 ARKit 依赖于 AVCapture 系统,并且不支持一次使用多个捕获设备。我找到了两个解决方案。

  1. 启动一个ARSession,实现ARSessionDelegate的功能session(_:didUpdate:)。每次捕获 ARFrame 时,在帧图像中搜索 QR 码。 (code)

    func session(_ session: ARSession, didUpdate frame: ARFrame) {
        let image = CIImage(cvPixelBuffer: frame.capturedImage)
        let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: nil)
        let features = detector!.features(in: image)
    
        for feature in features as! [CIQRCodeFeature] {
            if !discoveredQRCodes.contains(feature.messageString!) {
                discoveredQRCodes.append(feature.messageString!)
                let url = URL(string: feature.messageString!)
                let position = SCNVector3(frame.camera.transform.columns.3.x,
                                          frame.camera.transform.columns.3.y,
                                          frame.camera.transform.columns.3.z)
            }
         }
    } 
    
  2. 开始一个AVCaptureSession,当你识别和解码你的二维码时停止它并开始一个ARSession。 (不推荐)