Immediately freeze-frame an AVCaptureSession

I'm building an app that allows users to snap pictures using the iPhone camera, and am using AVFoundation when it's available (iOS4) so users can use the tap-to-focus feature, even with a custom overlay.

The problem I'm having is that captureStillImageAsynchronouslyFromConnection takes several seconds to complete, during which I'd like to freeze-frame the main video feed so there isn't a confusing state where the video is still running, but the user has snapped a photo (and the camera shutter sound has gone off).

I've tried calling [session stopRunning] right after I request a still image capture, but this leads to unpredictable results; the still image completion block often doesn't get fired in that case.

Any ideas on how I could have the video preview layer "pause" as soon as the shutter is hit?

14
задан Zeppomedio 18 August 2010 в 23:53
поделиться

2 ответа

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

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

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

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

Будьте здоровы, Одед.

5
ответ дан 1 December 2019 в 09:59
поделиться

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

Вы можете изменить альфа AVCaptureVideoPreviewLayer на 0,5, чтобы создать впечатление затемненного изображения, даже если оно все еще работает.

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

4
ответ дан 1 December 2019 в 09:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: