Unity Vuforia使用AVCaptureSession扩展EXC_BAD_ACCESS

时间:2017-11-26 08:19:34

标签: ios objective-c unity3d vuforia

所以我将Unity 2017.2.0f3与Vuforia Extension一起使用,我在https://github.com/blitzagency/ios-unity5教程之后在现有的iOS项目中导入了该项目。现有的iOS项目包括一个视图,您可以在其中切换使用Vuforia的AR视图和可以扫描条形码的原生iOS AVCaptureSession。前者工作没有错误,但是一旦我尝试session.addInputsession.addOutput后一个功能崩溃:

EXC_BAD_ACCESS

com.apple.avfoundation.videodataoutput.bufferqueue队列中

。 我尝试使用NSZombie来了解更多关于什么类型的对象试图发送消息,但我只能在物理设备上运行应用程序,因此我无法了解它尝试的实际对象发送导致崩溃的消息。

我的理由是,它可能与Vuforia持久引用已释放的VIdeoDataOutput缓冲区队列有关,该队列是由我创建的AVCaptureSession AVCaptureOutputAVCaptureInput新的CameraCapture.mm触发的}。棘手的是,我不知道如何确定这一点与否,因为它是第三方图书馆。唯一一个具有Objective-C包装器的ViewController被称为NSLogs,但这似乎是一个残留的Unity唯一的视图控制器,因为我在该方法中放置的任何private func setupCamera() { guard let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo), let input = try? AVCaptureDeviceInput(device: device) else { return } if session.canAddInput(input) { session.addInputWithNoConnections(input) } previewLayer = AVCaptureVideoPreviewLayer(session: session) previewLayer.frame = self.view.bounds previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill view.layer.addSublayer(previewLayer) cameraPreviewView.layer.addSublayer(previewLayer) let metadataOutput = AVCaptureMetadataOutput() if session.canAddOutput(metadataOutput) { session.addOutputWithNoConnections(metadataOutput) metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) metadataOutput.metadataObjectTypes = metadataOutput.availableMetadataObjectTypes } else { print("Could not add metadata output") } } 或断点都不会被调用。

AppDelegate

调用上述方法后,即使在闪电战教程appDelegate.stopUnity()中调用echo $value;函数后,也始终会崩溃应用程序。

1 个答案:

答案 0 :(得分:0)

所以基本上我得到的错误来自Unity在后台时并没有真正退出。这是一个可以在Unity本身中为iOS Unity导出配置的设置。如果你去编辑>播放器设置>然后在其他设置下右侧的检查器中,有一个名为背景中的行为的字段。我的原始导出将此设置为 Suspend ,这导致Unity / Vuforia中的Camera固有的AVCaptureSession在视频输出委托缓冲区方面不可能被清除,而Unity并非如此因此,当我认为Unity停止并开始新的EXC_BAD_ACCESS时,生成AVCaptureSession。所以通过将背景中的行为切换到退出,然后在我的应用程序中保证我在为新{appDelegate.stopUnity()设置输入/输出对之前调用了AVCaptureSession() 1}}成功解决了这个问题。