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:
,属于AVCapturePhotoOutput
class。 -
表示它是一个实例方法(+
表示它是一个 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:)
我在下面使用的代码应该拍摄照片,然后将图像转换为 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 selectorcaptureOutput:didFinishProcessingPhoto:error:
, or the deprecatedcaptureOutput: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:
,属于AVCapturePhotoOutput
class。-
表示它是一个实例方法(+
表示它是一个 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 asphotoOutput(_: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:)