我正在创建一个使用AVFoundation录制视频的应用程序。我有一个Login View Contoller,它连接到View Controller(用户可以在此处查看其个人资料详细信息),而后者又连接到Data Collection View Controller(这是摄像机所在的位置)。一切正常,但是当我单击“后退”按钮返回到View Controller,然后单击“开始数据收集”以第二次返回摄像机时,应用程序崩溃。
崩溃信息:
2018-08-11 11:39:51.861569 + 0100 LiopaDatacapture-iOS [6343:1642808] * 由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'* -[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玩了一下,但是我是新手,并不认为我完全了解他们的工作,或者这是引起问题的原因。
SessionHandler类变量需要与Objective-C类共享,因此我创建了它的共享实例以在整个应用程序中使用。
static let sharedSession = SessionHandler()
很难知道共享什么代码很有用,但是如果您需要更多信息,我很乐意提供。
答案 0 :(得分:0)
最后,答案似乎很简单,对这个大问题深表歉意!
这是因为重新加载DataCaptureViewController时metadataObjectTypes为空。因此,我创建了一个viewDidAppear方法,并将metaObjectObjectTypes设置为在其中面对。
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]
}
该应用似乎正在运行。如果我做错了,尽管可以随时纠正!