Swift 如果您在设置中指定了非 nil 格式的字典,您的代理必须响应选择器 captureOutput:didFinishProcessingPhoto

Swift If you specify a non-nil format dictionary in your settings, your delegate must respond to the selector captureOutput:didFinishProcessingPhoto

我在下面使用的代码应该拍摄照片,然后将图像转换为 base64,以便将其发送到服务器。该代码可以拍摄照片,将其转换为 base64,并将其上传到我的服务器,但已停止工作。我曾尝试使用其他堆栈溢出帖子来解决此问题,但它对我没有用。感谢您提前回复!

错误

Thread 1: Exception: "*** -[AVCapturePhotoOutput capturePhotoWithSettings:delegate:] If you specify a non-nil format dictionary in your settings, your delegate must respond to the selector captureOutput:didFinishProcessingPhoto:error:, or the deprecated captureOutput:didFinishProcessingPhotoSampleBuffer:previewPhotoSampleBuffer:resolvedSettings:bracketSettings:error:"

代码:

@IBAction func takePhotoButtonPressed(_ sender: Any) {
      let settings = AVCapturePhotoSettings()
      let previewPixelType = settings.availablePreviewPhotoPixelFormatTypes.first!
      let previewFormat = [kCVPixelBufferPixelFormatTypeKey as String: previewPixelType,
                           kCVPixelBufferWidthKey as String: 160,
                           kCVPixelBufferHeightKey as String: 160]
      settings.previewPhotoFormat = previewFormat
      sessionOutput.capturePhoto(with: settings, delegate: self)
}
        

func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
    let imageData = photo.fileDataRepresentation()
    let base64String = imageData?.base64EncodedString()
    print(base64String!)
}

让我们分解错误信息:

  • Thread 1: Exception:

    您程序的线程 1(可能是主线程)抛出了 Objective C 异常。不是特别 interesting/insightful.

  • -[AVCapturePhotoOutput capturePhotoWithSettings:delegate:]

    此语法描述了引发异常的 Objective-C 方法。该方法的选择器是capturePhotoWithSettings:delegate:,属于AVCapturePhotoOutputclass。 - 表示它是一个实例方法(+ 表示它是一个 class 方法)。

  • If you specify a non-nil format dictionary in your settings ...`

    是这种情况,您调用 capturePhoto(with: settings, ... 时使用的设置不是 nil

  • your delegate must respond to the selector captureOutput:didFinishProcessingPhoto:error:

    系统抱怨您传递了一个不响应选择器的委托 captureOutput:didFinishProcessingPhoto:error: (In Swift, the method is imported as photoOutput(_:didFinishProcessingPhoto:error:))。

    也就是说,您的委托没有定义任何具有该名称的方法。您决定将 self (不管是什么,没有上下文我不知道)作为委托传递:capturePhoto(..., delegate: self).

    无论 self 是什么类型,它已经符合 AVCapturePhotoCaptureDelegate 协议(否则永远不会编译)。但是它没有实现这个协议可选的方法,但是在这个上下文中是强制性的。

  • or the deprecated captureOutput:didFinishProcessingPhotoSampleBuffer:previewPhotoSampleBuffer:resolvedSettings:bracketSettings:error:

    这只是告诉您,您可以通过实施 captureOutput:didFinishProcessingPhotoSampleBuffer:previewPhotoSampleBuffer:resolvedSettings:bracketSettings:error: 来解决此问题,而不是 captureOutput:didFinishProcessingPhoto:error:,但由于它已被弃用,您可能不应该使用它。

所以总而言之,无论self是什么类型,你都需要确保它实现了方法photoOutput(_:didFinishProcessingPhoto:error:)