我有以下代码,在 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 18 开始我面临着同样的事情。与你相同的代码。照片拍摄前 1 或 2 次可以正常工作,然后开始失败并出现相同的错误。添加
maxPhotoQualityPrioritization
设置对我没有帮助。苹果新的相机 AVCam 演示代码库没有遇到同样的问题,所以他们一定在做一些不同的事情,但很难分类,因为它是如此的显着不同。