【问题标题】:App crashes with: startRunning may not be called between calls to beginConfiguration and commitConfiguration?应用程序崩溃:在对 beginConfiguration 和 commitConfiguration 的调用之间可能不会调用 startRunning?
【发布时间】: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


【解决方案1】:

尝试放置声明captureSession.commitConfiguration() 警戒区外。这是因为提交必须与beginConfiguration()在同一级别完成

【讨论】:

    【解决方案2】:

    我最近遇到了这个问题:当我在开发应用程序的一个完全不同的部分时,它突然发生了。

    删除重新安装好像解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 2015-08-13
      相关资源
      最近更新 更多