You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:55:29