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?
Я пытаюсь сделать то же самое. Хотя в моем случае captureStillImageAsynchronouslyFromConnection возвращается за 0.5 секунды, так что, возможно, вы делаете какую-то обработку в обработчике завершения?
Если это так, я придумал 2 варианта, оба из которых недостаточны для меня, но могут подойти для вас
То, что я придумал, это:
* вызвать stopRunning на сессии захвата, когда вызывается обработчик завершения (опять же, 0.5 секунды в моем случае), а затем после обработки снова вызвать startRunning *.
* иметь UIImageView поверх оверлея, и хранить в нем последний снимок, полученный либо с камеры, либо из видеопотока, пока вы выполняете обработку.
Что меня оттолкнуло от обоих решений, так это то, что они оба добавляют пару секунд к процессу. Но я надеюсь, что это поможет или даст направление.
Будьте здоровы, Одед.
Простое замораживание кадра создает у пользователя впечатление, что изображение на экране уже снято, что неверно - по крайней мере, я бы показал тусклое изображение. Camera.app обходит проблему, закрыв «шторку».
Вы можете изменить альфа AVCaptureVideoPreviewLayer на 0,5, чтобы создать впечатление затемненного изображения, даже если оно все еще работает.
Другой вариант - использовать AVCaptureVideoDataOutput и некоторые манипуляции с изображением для получения неподвижного изображения. К сожалению, одновременное использование AVCaptureVideoDataOutput и AVCaptureStillImageOutput не представляется возможным; обходной путь - реализовать функцию «сделать снимок» путем захвата следующего видеокадра (конечно, это ограничено разрешением вашего видео, но это нормально, если вы просто хотите выполнить обработку изображения в кадре).