Подтвердить что ты не робот

Сразу же заморозить рамку AVCaptureSession

Я создаю приложение, которое позволяет пользователям делать снимки с помощью камеры iPhone, и я использую AVFoundation, когда это доступно (iOS4), чтобы пользователи могли использовать функцию tap-to-focus даже с пользовательским наложением.

Проблема, с которой я столкнулась, заключается в том, что captureStillImageAsynchronouslyFromConnection требуется несколько секунд, в течение которых я хотел бы заморозить фрейм основного видеоподачи, чтобы не было запутанного состояния, когда видео все еще работает, но пользователь щелкнул фотографию (и звук затвора камеры погас).

Я попытался позвонить [session stopRunning] сразу после запроса на съемку неподвижного изображения, но это приводит к непредсказуемым результатам; блок завершения неподвижного изображения часто не запускается в этом случае.

Любые идеи о том, как я мог бы слот предварительного просмотра видео "приостанавливать" сразу после срабатывания затвора?

4b9b3361

Ответ 1

Я пытаюсь сделать то же самое. Хотя в моем случае captureStillImageAsynchronouslyFromConnection занимает 0,5 секунды, чтобы вернуться, возможно, вы выполняете некоторую обработку в обработчике завершения?

Если в этом случае, я придумал 2 варианта, которые для меня не достаточны, но могут сделать для вас

То, что я придумал, - это:
* вызывать stopRunning в сеансе захвата при вызове обработчика завершения (опять же, 0,5 секунды в моем случае), а затем после обработки вызова startRunning снова.
* иметь UIImageView поверх наложения и сохранять последний снимок, сделанный с камеры или видеопотока в этом представлении изображения, пока вы делаете свою обработку.

Что обескуражило меня из обоих решений, так это то, что они оба добавляют к процессу пару секунд. Но я надеюсь, что это поможет или даст направление.

Cheers, Одед.

Ответ 2

Вам просто нужно установить ваш captureVideoPreviewLayer.connection.enabled = NO;

Для подробностей, пожалуйста, смотрите мой ответ здесь:

AVCaptureSession пауза?

Ответ 3

Простое замораживание-фреймирование дает пользователю впечатление, что изображение на экране уже выполнено, что является ложным — по крайней мере, я покажу тусклое изображение. Camera.app обходит проблему, закрывая "затвор".

Вы можете изменить AVCaptureVideoPreviewLayer alpha на 0.5, чтобы создать впечатление тусклого изображения, даже если оно все еще работает.

Другой вариант - использовать AVCaptureVideoDataOutput и некоторые манипуляции с изображениями для получения неподвижного изображения. К сожалению, не представляется возможным одновременно использовать AVCaptureVideoDataOutput и AVCaptureStillImageOutput; обходным путем является реализация функциональности "снимок", захватив следующий видеокадр (конечно, это ограничено вашим разрешением видео, но это нормально, если вы просто хотите обработать изображение на кадре).

Ответ 4

Старый ответ, но вот обновление для любопытного: в iOS5 вы можете одновременно использовать AVCaptureStillImageOutput и AVCaptureVideoDataOutput. У меня был приличный успех, одновременно захватив следующий видеокадр и неподвижное изображение. Я использую простую анимацию выцветания, которая скрывает пользовательский интерфейс, а затем исчезает, когда я возвращаю изображение из AVCaptureVideoDataOutput. Этот процесс намного быстрее, чем ожидание неподвижного изображения через AVCaptureStillImageOutput captureStillImageAsynchronouslyFromConnection:completionHandler:, скорее всего, из-за меньшего и более низкого качества изображений, которые выходят из AVCaptureVideoDataOutput.