Как избежать мигания AVCaptureVideoPreviewLayer при изменении AVCaptureOutput

У меня есть текущий сеанс и слой предварительного просмотра, который представлен внутри моего представления.

Мне нужно несколько раз изменить вывод в моем приложении среди AVCaptureStillImageOutput, AVCaptureMetadataOutput и AVCaptureVideoDataOutput, в то время как мой предварительный просмотр должен отображаться плавно, не мигая.

Проблема: когда я добавляю вывод в эту сессию, превью мигает (пожалуйста, найдите мой прикрепленный gif).

Конкретные строки вызывают проблему:

self.stillImageOutput = AVCaptureStillImageOutput()
self.stillImageOutput?.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
if session.canAddOutput(self.stillImageOutput) {
    session.addOutput(self.stillImageOutput)
}

Мой вопрос: как избежать мигания AVCaptureVideoPreviewLayer при добавлении вывода в текущий сеанс?

1 ответ

Решение

В этой статье я нашел решение для iPhone 6 и выше, которое описывает, как захватывать неподвижные изображения с высоким разрешением во время видео:

Новые функции AV Foundation Camera для iPhone 6 и iPhone 6 Plus

...

... захватывать неподвижные изображения с полным разрешением без прерывания предварительного просмотра и перенастройки устройства.

Решение:

Вместо добавления и удаления выходов, я добавляю все выходы в сеанс.

Для захвата видео я установил требуемое разрешение (1280x720) в предустановке сеанса:

session.sessionPreset = AVCaptureSessionPreset1280x720

Результатом этой строки является то, что активный формат устройства захвата (задняя камера в моем случае) изменился.

Каждый формат имеет HRSI (неподвижное изображение с высоким разрешением), который описывает размеры изображений с высоким разрешением.

Эта функция отключена по умолчанию. Чтобы включить его, вы вызываете AVCaptureStillImageOutput setHighResolutionStillImageOutputEnabled:.

Для получения неподвижных изображений с высоким разрешением флаг highResolutionStillImageOutputEnabled должен иметь значение true:

self.stillImageOutput?.highResolutionStillImageOutputEnabled = true

Например, для iPhone 6 разрешение неподвижного изображения составляет: 3264x1836, а предварительный просмотр камеры не мигает.

Другие вопросы по тегам