捕获会话关闭相机

问题描述 投票:0回答:1

我有一个问题,我不知道是什么原因引起的。所以我希望能够使用相机扫描二维码,但我立即将数据设置为捕获会话应用程序关闭,甚至手机被锁定。除了

Output
之外,奇怪的
XPC connection interrupted
中没有任何报道。没有找到我遇到的问题与此输出之间的相关性。

值得一提的是,在我为测试目的创建的全新项目中,相同的代码基本上是复制粘贴的。所以相机和二维码扫描工作。

我的假设是项目配置出了问题,我不知道是什么。

代码如下:

 guard let videoCaptureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) else {
        print("Camera access failed")
        return
        
    }
            
    do {
        let videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)
        captureSession.addInput(videoInput)
    } catch {
        failed()
        return
    }
    
    let metadataOutput = AVCaptureMetadataOutput()
    
    captureSession.addOutput(metadataOutput)
    metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
    
    guard metadataOutput.availableMetadataObjectTypes.contains(.qr) else {return}
    metadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]
    
    
    let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
    previewLayer.frame = view.layer.bounds
    previewLayer.videoGravity = .resizeAspectFill
    view.layer.addSublayer(previewLayer) 
    startScanner() 
    }
  // View Did Load ends here

   func startScanner() {
    
    // Check camera usage permission
    switch AVCaptureDevice.authorizationStatus(for: .video) {
    case .authorized:
        print("Scan View Controller || Permission to use camera granted")
        DispatchQueue.global().async {
            self.captureSession.startRunning()
        }
    case .notDetermined:
        print("Scan View Controller || Permission to use camera not determined")
        AVCaptureDevice.requestAccess(for: .video) { granted in
            if granted {
                DispatchQueue.global().async {
                    self.captureSession.startRunning()
                }
            }
        }
    case .denied:
        print("Scan View Controller || Permission to use camera denied")
        return
    case .restricted:
        return
    @unknown default:
        return
    }
}

但是立即启动屏幕结果是下图:

或查看 Reddit 问题中的视频: https://www.reddit.com/r/iOSProgramming/comments/11l6tht/xpc_connection_interrupted_capture_session/

ios swift avcapturesession
1个回答
0
投票

不幸的是,没有完整的堆栈跟踪,很难说出问题是什么。

一般来说,改变 AVCaptureSession 或任何 它的输入、输出或同时来自多个线程的连接 时间。

我建议创建您自己的队列,并使用它而不是使用 AVFoundation 为所有操作获取全局队列:

let sessionQueue = DispatchQueue(label: "com.name.AVFoundation", attributes: [], autoreleaseFrequency: .workItem)


sessionQueue.async {

}

我还注意到您的会话配置不完全正确:

您应该在更改会话的之前调用 beginConfiguration 方法 inputs or outputs, make后调用commitConfiguration方法 变化。

© www.soinside.com 2019 - 2024. All rights reserved.