AVFoundation 摄像机在返回视图控制器 Swift 4 时崩溃



我正在创建一个应用程序,用户AVFoundation可以录制视频。我有一个登录视图控制器,它通向一个视图控制器(用户可以在此处查看他们的个人资料详细信息(,该控制器通向数据收集视图控制器(这是显示摄像机的地方(。一切正常,但是当我单击后退按钮返回视图控制器,然后单击"开始数据收集"第二次返回摄像机时,应用程序崩溃了。

崩溃信息:

2018-08-11 11:39:51.861569+0100 LiopaDatacapture-iOS[6343:1642808]* 由于未捕获的异常而终止应用 'NSInvalidArgumentException', reason: '*-[AVCaptureMetadataOutput setMetadataObjectTypes:] 找到不支持的类型 - 使用 -availableMetadataObjectTypes' 第一个抛出调用堆栈:(0x1842e6d8c 0x1834a05ec 0x189e54b44 0x10128f4fc 0x1012989a4 0x101298ca4 0x18df01e64 0x18df01a50 0x18eaa4fd8 0x18e12b398 0x18e12a25c 0x18e3a33a0 0x18e0e13e4 0x18e1297bc 0x18e129654 0x18e3a6350 0x18e734d24 0x18e881af4 0x18e8819a0 0x18e39a49c 0x101297f5c 0x18e05564c 0x18e176870 0x18e05b700 0x18e1911a8 0x18e0d89e0 0x18e0cd890 0x18e0cc1d0 0x18e8add1c 0x18e8b02c8 0x18e8a9368 0x18428f404 0x18428ec2c 0x18428c79c 0x1841acda8 0x186192020 0x18e1cc758 0x101284a90 0x183c3dfc0( libc++abi.dylib:以未捕获的异常终止 类型 NSException (lldb(

我正在使用AVCaptureMetadataOutput来检测人脸。此代码位于正在设置摄像机的 SessionHandler 类中。

// define metadata
let metaOutput = AVCaptureMetadataOutput()
if cameraSession.canAddOutput(metaOutput) {
metaOutput.setMetadataObjectsDelegate(self, queue: faceQueue)
cameraSession.addOutput(metaOutput)
print("metaoutput added")
}
// set metadata to look for faces
metaOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.face]

在我的DataCaptureViewController中.swift这是我加载摄像机的地方 -

override func viewDidLoad() {
super.viewDidLoad()
sessionHandler.setupCamera()
audioRecorder.setUpAudioSession()
createObservers()
let layer = sessionHandler.layer
layer.frame = previewView.bounds
previewView.layer.addSublayer(layer)
view.layoutIfNeeded()
jsonSentence.text = "Press start button to get phrase"
startButton.setTitle("Start", for: .normal)
}

我已经尝试了一下viewDidAppear和viewWillAppear,但我是swift的新手,并且认为我不完全了解他们做什么,或者这是否是导致问题的原因。

SessionHandler类变量需要与Objective-C类共享,因此我创建了一个共享实例,以便在整个应用程序中使用。

static let sharedSession = SessionHandler()

很难知道共享哪些代码有用,但如果您需要更多信息,我很乐意提供。

最后答案似乎很简单,对不起这个大问题!

这是因为重新加载 DataCaptureViewController 时 metadataObjectType 为空。所以我创建了一个 viewDidSeem 方法,并将元数据对象类型设置为面向那里。

override func viewDidLoad() {
super.viewDidLoad()
sessionHandler.setupCamera()
audioRecorder.setUpAudioSession()
createObservers()
let layer = sessionHandler.layer
layer.frame = previewView.bounds
previewView.layer.addSublayer(layer)
view.layoutIfNeeded()
jsonSentence.text = "Press start button to get phrase"
startButton.setTitle("Start", for: .normal)

}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
sessionHandler.metaOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.face]
}

该应用程序现在似乎可以正常工作。如果我做错了,请随时纠正!

最新更新