Немедленно зафиксируйте AVCaptureSession - PullRequest
14 голосов
/ 19 августа 2010

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

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

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

Есть идеи, как сделать так, чтобы слой предварительного просмотра видео "пауза", как только срабатывает затвор?

Ответы [ 4 ]

18 голосов
/ 15 апреля 2013

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

Подробнее см. Мой ответ здесь:

AVCaptureSession pause?

5 голосов
/ 22 августа 2010

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

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

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

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

Приветствия, Одед.

4 голосов
/ 19 августа 2010

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

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

0 голосов
/ 28 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...