【发布时间】:2018-09-05 00:34:13
【问题描述】:
我正在开发一个使用名为 WeScan 的 pod 的应用程序(请参阅他们的 github)。
设置完所有内容并将正确的项目添加到我的 info.plist 文件后,我的应用程序不断崩溃。
错误是:
由于未捕获的异常“NSGenericException”而终止应用程序,原因:“*** - [AVCaptureSession startRunning] startRunning 可能不会在调用 beginConfiguration 和 commitConfiguration 之间被调用”“
这是我认为导致问题的 pod 中的代码:
init?(videoPreviewLayer: AVCaptureVideoPreviewLayer) {
self.videoPreviewLayer = videoPreviewLayer
super.init()
captureSession.beginConfiguration()
captureSession.sessionPreset = AVCaptureSession.Preset.photo
photoOutput.isHighResolutionCaptureEnabled = true
let videoOutput = AVCaptureVideoDataOutput()
videoOutput.alwaysDiscardsLateVideoFrames = true
guard let inputDevice = AVCaptureDevice.default(for: AVMediaType.video),
let deviceInput = try? AVCaptureDeviceInput(device: inputDevice),
captureSession.canAddInput(deviceInput),
captureSession.canAddOutput(photoOutput),
captureSession.canAddOutput(videoOutput) else {
let error = ImageScannerControllerError.inputDevice
delegate?.captureSessionManager(self, didFailWithError: error)
return
}
captureSession.addInput(deviceInput)
captureSession.addOutput(photoOutput)
captureSession.addOutput(videoOutput)
videoPreviewLayer.session = captureSession
videoPreviewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "video_ouput_queue"))
captureSession.commitConfiguration()
}
// MARK: Capture Session Life Cycle
/// Starts the camera and detecting quadrilaterals.
internal func start() {
let authorizationStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video)
switch authorizationStatus {
case .authorized:
self.captureSession.startRunning()
isDetecting = true
case .notDetermined:
AVCaptureDevice.requestAccess(for: AVMediaType.video, completionHandler: { (_) in
DispatchQueue.main.async { [weak self] in
self?.start()
}
})
default:
let error = ImageScannerControllerError.authorization
delegate?.captureSessionManager(self, didFailWithError: error)
}
}
internal func stop() {
captureSession.stopRunning()
}
internal func capturePhoto() {
let photoSettings = AVCapturePhotoSettings()
photoSettings.isHighResolutionPhotoEnabled = true
photoSettings.isAutoStillImageStabilizationEnabled = true
if let photoOutputConnection = self.photoOutput.connection(with: .video) {
photoOutputConnection.videoOrientation = AVCaptureVideoOrientation(deviceOrientation: UIDevice.current.orientation) ?? AVCaptureVideoOrientation.portrait
}
【问题讨论】:
-
其他用户将您的问题标记为低质量和需要改进。我重新措辞/格式化您的输入,使其更容易阅读/理解。请查看我的更改以确保它们反映您的意图。如果您对我有其他问题或反馈,请随时给我留言。
-
一切看起来都很棒很抱歉!
-
别担心,下次做得更好;-)
标签: swift xcode avcapturesession