升级Xcode 14.0与iOS 16.0后SwiftUI项目出现Espresso报错求助
问题解决:iOS16 + Xcode14下Vision框架Espresso报错(status=-5)
可能原因
- Vision框架在iOS16/Xcode14版本中对请求生命周期管理更严格,若
requests中的请求实例被重复复用或未正确重置状态,会触发该报错 - 传入的图像方向参数(
CGImagePropertyOrientation(rawValue:6))与cmBuffer实际图像属性不匹配,导致底层Espresso推理引擎状态异常 requestOptions中的旧配置与iOS16不兼容,比如部分性能选项被废弃或行为变更
解决方法
1. 避免复用Vision请求实例
每次调用perform前重新创建请求实例,不要复用self.requests:
// 每次调用时重新生成请求,替代原有的self.requests let requests = [VNDetectFaceRectanglesRequest(completionHandler: { request, error in // 你的业务处理逻辑 })] let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: cmBuffer, orientation: CGImagePropertyOrientation(rawValue: 6)!, options: requestOptions) do { try imageRequestHandler.perform(requests) } catch { print(error) }
2. 校验图像方向参数的正确性
确认cmBuffer的实际图像方向是否真的对应CGImagePropertyOrientation(rawValue:6)(即.right,顺时针旋转90度),可通过打印buffer宽高判断:
let bufferWidth = CVPixelBufferGetWidth(cmBuffer) let bufferHeight = CVPixelBufferGetHeight(cmBuffer) print("Buffer尺寸:\(bufferWidth)x\(bufferHeight)") // 若宽小于高,可能方向参数需调整为.rawValue=1(.up)
3. 清理requestOptions中的旧配置
移除requestOptions中可能不兼容的选项,先用空配置测试:
// 先使用默认配置排查问题 let requestOptions: [VNImageRequestHandlerOption: Any] = [:] let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: cmBuffer, orientation: .right, options: requestOptions)
4. 确保CVPixelBuffer格式符合要求
Vision框架优先支持kCVPixelFormatType_32BGRA或kCVPixelFormatType_24RGB格式,可转换buffer格式后传入:
func convertToBGRA(buffer: CVPixelBuffer) -> CVPixelBuffer? { let ciImage = CIImage(cvPixelBuffer: buffer) let context = CIContext(options: [.workingColorSpace: NSNull()]) var outputBuffer: CVPixelBuffer? CVPixelBufferCreate(kCFAllocatorDefault, CVPixelBufferGetWidth(buffer), CVPixelBufferGetHeight(buffer), kCVPixelFormatType_32BGRA, nil, &outputBuffer) guard let validOutputBuffer = outputBuffer else { return nil } context.render(ciImage, to: validOutputBuffer) return validOutputBuffer } // 使用转换后的buffer执行请求 if let convertedBuffer = convertToBGRA(buffer: cmBuffer) { let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: convertedBuffer, orientation: .right, options: requestOptions) do { try imageRequestHandler.perform(requests) } catch { print(error) } }
额外排查步骤
- 重启Xcode和测试设备,清除项目Derived Data(Xcode -> 设置 -> 位置 -> Derived Data -> 打开文件夹后删除对应项目文件夹)
- 用静态图片替代CVPixelBuffer测试,确认是否为buffer本身的问题
内容的提问来源于stack exchange,提问作者Hope
相关产品推荐
相关产品推荐

