#swift #xcode #avfoundation #avcapturesession #ibaction
Вопрос:
Код, который я использую ниже, должен сделать фотографию, а затем преобразовать изображение в base64, чтобы отправить его на сервер. Код работал, делая фотографию, конвертируя ее в base64 и загружая на мой сервер, но перестал работать. Я пытался использовать другие сообщения о переполнении стека для решения этой проблемы, но это не сработало для меня. Заранее спасибо за любые ответы!
Ошибка
Тема 1: Исключение: «***
-[AVCapturePhotoOutput capturePhotoWithSettings:delegate:]
Если вы указываетеnil
в настройках словарь без формата, ваш делегат должен ответить на селекторcaptureOutput:didFinishProcessingPhoto:error:
или устаревший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!)
}
Комментарии:
1. Вы понимаете сообщение об ошибке?
2. Я этого не понимаю
Ответ №1:
Давайте разберем сообщение об ошибке:
-
Поток 1: Исключение:
Исключение Objective C было вызвано из потока 1 вашей программы (вероятно, это основной поток). Не особенно интересно/проницательно.
-
-[AVCapturePhotoOutput capturePhotoWithSettings:delegate:]
Этот синтаксис описывает метод Objective-C, который вызвал исключение. Селектор метода есть
capturePhotoWithSettings:delegate:
, и он принадлежитAVCapturePhotoOutput
классу.-
Указывает, что это метод экземпляра (где a -
Если вы укажете словарь ненулевого формата в своих настройках …`
В этом случае вы позвонили
capturePhoto(with: settings, ...
с настройками, которых нетnil
. -
ваш делегат должен ответить на селектор
captureOutput:didFinishProcessingPhoto:error:
Система жалуется, что вы передали делегат, который не отвечает на селектор
captureOutput:didFinishProcessingPhoto:error:
(в Swift метод импортируется какphotoOutput(_:didFinishProcessingPhoto:error:)
).То есть ваш делегат не определяет никаких методов с таким именем. Вы решили передать
self
(что бы это ни было, я не знаю без контекста) в качестве делегата:capturePhoto(..., delegate: self)
.Каким бы ни был тип
self
, он уже соответствуетAVCapturePhotoCaptureDelegate
протоколу (иначе он никогда бы не был скомпилирован). Но он не реализует этот метод, который является необязательным по протоколу, но обязательным в данном контексте. -
или устаревшие
captureOutput:didFinishProcessingPhotoSampleBuffer:previewPhotoSampleBuffer:resolvedSettings:bracketSettings:error:
Это просто говорит вам о том , что вместо этого
captureOutput:didFinishProcessingPhoto:error:
вы могли бы решить эту проблему , реализовавcaptureOutput:didFinishProcessingPhotoSampleBuffer:previewPhotoSampleBuffer:resolvedSettings:bracketSettings:error:
, но поскольку это устарело, вам, вероятно, не следует его использовать.
Таким образом, в целом, независимо от типа self
, вам нужно убедиться, что он реализует метод photoOutput(_:didFinishProcessingPhoto:error:)