升级到iOS 18后在AVCapturePhotoCaptureDelegate方法中接收AVError.Code.sessionNotRunning

问题描述 投票:0回答:1

我有以下代码,在 iOS 18 之前没有错误。 我有一个名为

PhotoCaptureManager
的封装照片拍摄课程,当用户转到相机屏幕时,我会懒洋洋地初始化会话:

lazy var captureSession: AVCaptureSession? = {
    let session = AVCaptureSession()
    session.automaticallyConfiguresApplicationAudioSession = false
    do {
        guard let videoDevice = self.currentVideoDevice else { return nil }
        let videoDeviceInput = try AVCaptureDeviceInput(device: videoDevice)
        guard session.canAddInput(videoDeviceInput) else { return nil}
        session.beginConfiguration()
        session.addInput(videoDeviceInput)
        session.addOutput(photoOutput)
        session.sessionPreset = .photo
        session.commitConfiguration()
        return session
    } catch {
        print(error)
        return nil
    }
}()

在 CameraViewController viewDidAppear 方法中,我调用了启动 captureSession 的方法:

private func setupCameraPreview() {
    DispatchQueue.main.async {
        self.cameraPreview.videoPreviewLayer.session = self.cameraManager.capture.captureSession
        DispatchQueue.global(qos: .userInteractive).async { [weak self] in
            self?.cameraManager.capture.captureSession?.startRunning()
        }
    }
}

当用户点击捕获按钮时,将执行以下代码:

func takePicture(_ completion: @escaping (_ imageData: Data?) -> Void) {
    takePictureCompletion = completion
    let settings = AVCapturePhotoSettings()
    photoOutput.connection(with: AVMediaType.video)?.videoOrientation = currentVideoOrientation(by: UIDevice.current.orientation)
    photoOutput.capturePhoto(with: settings, delegate: self)
}

在委托方法中处理结果:

extension DefaultPhotoCaptureManager: AVCapturePhotoCaptureDelegate {

    func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {

        if let error {
            print(error)
            return
        }

        guard let jpegData = photo.fileDataRepresentation() else { return }

        takePictureCompletion?(jpegData)
    }

    func photoOutput(_ output: AVCapturePhotoOutput, didCapturePhotoFor resolvedSettings: AVCaptureResolvedPhotoSettings) {
        print(resolvedSettings)
    }
}

resolvedSettings 总是打印成这样:

<<<< AVCapturePhotoOutput >>>> 图断言:“hasFigCaptureSession”保释 (AVCapturePhotoOutput.m:529) - (err=0)

错误是

可选 - 一些:错误域=AVFoundationErrorDomain代码=-11803 UserInfo={AVErrorRecordingFailureDomainKey=3

11803 代码是 AVError.Code.sessionNotRunning 但如果我检查

captureSession.isRunning
始终为
true
,并且
output.captureReadiness
始终为
ready

对我有帮助的是,它把它放在我的

takePicture
方法中(无论是
.speed
还是
.quality

if #available(iOS 18.0, *) {
    photoOutput.maxPhotoQualityPrioritization = .speed
}

之前

photoOutput.capturePhoto(with: settings, delegate: self)

文档中写的是

在会话运行时更改 maxPhotoQualityPrioritization 可能会导致会话重建时间过长,从而导致视频预览中断。

但它似乎莫名其妙地重新启动了会话,但我想知道 iOS 18 中发生了什么,我必须这样做。

其他人也面临同样的问题吗?

ios swift avfoundation avcapturesession ios18
1个回答
0
投票

是的,从 iOS 18 开始我面临着同样的事情。与你相同的代码。照片拍摄前 1 或 2 次可以正常工作,然后开始失败并出现相同的错误。添加

maxPhotoQualityPrioritization
设置对我没有帮助。苹果新的相机 AVCam 演示代码库没有遇到同样的问题,所以他们一定在做一些不同的事情,但很难分类,因为它是如此的显着不同。

© www.soinside.com 2019 - 2024. All rights reserved.