У нас была эта проблема, когда 4.0 все еще был в бета-версии. Я попробовал много чего. Здесь идет:
- AVCaptureStillImageOutput и AVCaptureVideoDataOutput, по-видимому, не очень хорошо играют друг с другом. Если видеовыход работает, вывод изображения, по-видимому, никогда не завершится (пока вы не приостановите сеанс, переведя телефон в спящий режим; тогда, кажется, вы получаете одно изображение).
- AVCaptureStillImageOutput работает только разумно с AVCaptureSessionPresetPhoto; в противном случае вы эффективно получаете JPEG-кодированные видеокадры. Можно также использовать более качественные кадры BGRA (кстати, родной выходной сигнал камеры, похоже, BGRA; цветовая субсэмплирование 2vuy / 420v не похоже).
- Видео (все, что не Photo) и предустановки Photo кажутся принципиально разными; вы никогда не получите никаких видеокадров, если сеанс находится в режиме фото (вы также не получаете ошибку). Может быть, они изменили это ...
- У вас не может быть двух сессий захвата (один с предустановкой видео и видеовыходом, один с предустановкой фото и выводом изображения). Они могли бы это исправить.
- Вы можете остановить сеанс, сменить предустановку на фотографию, начать сеанс, сделать снимок, а когда фотография завершится, остановить, снова изменить предустановку и начать снова. Это занимает некоторое время, и слой предварительного просмотра видео останавливается и выглядит ужасно (он повторно регулирует уровни экспозиции). Это также иногда блокируется в бета-версии (после вызова -stopRunning, session.running был все еще ДА).
- Возможно, вы сможете отключить AVCaptureConnection ( предполагается для работы). Я помню этот тупик; возможно, они исправили это.
Я закончил тем, что снимал видеокадры. Кнопка «сделать снимок» просто устанавливает флаг; в обратном вызове видеокадра, если установлен флаг, он возвращает видеокадр вместо UIImage *. Этого было достаточно для наших потребностей в обработке изображений & mdash; «сфотографировать» в значительной степени существует, так что пользователь может получить отрицательный ответ (и возможность отправить отчет об ошибке); на самом деле нам не нужны 2/3/5 мегапиксельные изображения, поскольку для их обработки требуется много времени.
Если видеокадры не достаточно хороши (т.е. вы хотите захватывать кадры видоискателя между захватами изображений с высоким разрешением), я сначала посмотрю, исправлены ли они с помощью нескольких сеансов AVCapture, так как это единственный способ, которым вы можете установить оба пресеты.
Вероятно, стоит подать ошибку. Я подал ошибку при запуске 4.0 GM; Apple попросила у меня пример кода, но к тому времени я решил использовать обходной путь для видеокадров и выпустил релиз.
Кроме того, предустановка "low" имеет значение очень low-res (и приводит к предварительному просмотру видео с низким разрешением и низкой частотой кадров). Я бы пошел на 640x480, если доступно, отступив на Medium, если нет.