Я создаю приложение фильтра камеры в реальном времени.
Я использую AVCaptureVideoDataOutput
для передачи сэмплебуфера в MTKView
для предварительного просмотра рендеринга и AVCapturePhotoOutput
для захвата фотографий.
И мое приложениеимеет некоторые параметры формата изображения для захвата фотографий.(включая 16: 9 и 4: 3)
Я хочу сделать предварительный просмотр в полноэкранном режиме (16: 9, но все, что ближе к этому, тоже подойдет), хотя пользователи выбирают 4: 3 варианта.
И я планирую показать границы границ в предварительном просмотре, чтобы пользователи могли определить размер выходного фото.
Мне нужен предустановленный параметр 16: 9, например 1280 * 720для предварительного просмотра и предустановки фотографий для захвата фотографий.
У меня появилось несколько идей.
Наличие двух AVCaptureSessions
с разными предустановками -> не подходит дляпроизводительность
Использование предустановки 1280 * 720 для захвата и обрезки выходных фотографий с форматным соотношением 4: 3 -> фотографии с низким разрешением
Переключите пресет перед вызовом метода photoOutput.capturePhoto
.-> предварительный просмотр останавливается через мгновение, потому что AVCaptureSession
должен быть обновлен
Я решил пойти с 3, но это дает мне ошибку.
(еслиесть лучший способ, пожалуйста, дайте мне знать)
это мой код.
@IBAction func takePhoto(_ sender: UIButton) {
captureSessionQueue.async {
var photoSettings = AVCapturePhotoSettings()
photoSettings.isHighResolutionPhotoEnabled = true
// switch preset from .hd1280*720 to .photo
self.session.beginConfiguration()
if self.session.canSetSessionPreset(.photo) {
self.session.sessionPreset = .photo
}
self.session.commitConfiguration()
self.photoOutput.capturePhoto(with: photoSettings, delegate: self)
self.session.beginConfiguration()
self.session.sessionPreset = .hd1280*720
self.session.commitConfiguration()
}
}
ошибка:
Ошибка домена = AVFoundationErrorDomain Code =-11800 "Операция не может быть завершена" UserInfo = {NSLocalizedFailureReason = Произошла неизвестная ошибка (-16800), NSLocalizedDescription = Операция не может быть завершена, NSUnderlyingError = 0x280013720 {Ошибка домена = NSOSStatusErrorDomain Code = -16800 "(null)"}}
Я думаю, это потому, что я вызываю capturePhoto
метод до того, как сессия завершит обновление до новой предустановки.
, когда я вызываю self.photoOutput.capturePhoto
метод 1 или 2 секунды послеcommitConfiguration()
, это работает.
Итак, есть ли какой-нибудь способ, которым я могу знать о завершении обновлений AVCaptureSession
или есть лучшее решение, имеющее дело с различным соотношением сторон между выводом видеоданных и выводом фотографий