Доступ к новым API-интерфейсам iOS 6 для экспонирования камеры и скорости затвора

На странице Apple iOS 6.0 она говорила

Воспользуйтесь расширенными функциями встроенных камер. Новые API позволяют контролировать фокус, экспозицию и область интересов. Вы также можете просматривать и отображать лица с помощью API-интерфейсов распознавания лиц и использовать стабилизацию видео с поддержкой аппаратного обеспечения.

Этот текст с тех пор был удален, и я не могу найти новые методы в API для контроля экспозиции. В классе AVCaptureDevice в разделе "Настройки экспозиции" нет нового свойства/метода для iOS 6.0. Вы знаете, где я могу найти новые функции для экспонирования в API?

Ответ 1

Верно, что в AVCaptureDevice есть свойство -exposureMode, но это только для установки режима (off/auto/непрерывный), а не фактического f-stop, SS или ISO. Приложения для камеры, которые обеспечивают управление "экспозицией", все, похоже, делают это через пост-обработку.

Однако, похоже, в этой инфраструктуре есть недокументированные API-интерфейсы. Ознакомьтесь с полными заголовками для AVCaptureDevice.h (через class-dump) и обратите внимание на следующие методы:

- (void)setManualExposureSupportEnabled:(BOOL)arg1;
- (BOOL)isManualExposureSupportEnabled;

- (void)setExposureGain:(float)arg1;
- (float)exposureGain;

- (void)setExposureDuration:(struct { long long x1; int x2; unsigned int x3; long long x4; })arg1;
- (struct { long long x1; int x2; unsigned int x3; long long x4; })exposureDuration;

- (void)setExposureMode:(int)arg1;
- (int)exposureMode;

- (BOOL)isExposureModeSupported:(int)arg1;

Моя догадка gain эквивалентна f-stop (фиксированная апертура), а duration - выдержка затвора. Интересно, используются ли они для iPhone 5 режим с низким освещением.

Вы также можете использовать otool, чтобы сориентироваться и попытаться объединить символы. Вероятно, новая константа в exposureMode для включения ручного управления, а exposureDuration похоже, что она имеет также флаги. При их вызове обязательно используйте новый -isExposureModeSupported:, а также вызовите -respondsToSelector:, чтобы проверить совместимость.

Как всегда, использование частных API-интерфейсов не одобряется Apple и является причиной отказа от App Store. Могут быть способы обойти это, например, скрывать вызовы с помощью -performSelector: или obc_msgsend с помощью строк rot13 или что-то еще, так как я довольно конечно, они делают статический анализ только в бинарном приложении.

Ответ 2

Мне удалось "обмануть" камеру за меньшее время экспозиции, но я подозреваю, что она будет полезной только для тех, кто делает подобное (макро) изображение. Я сначала настроил AVCaptureDevice для использования AVCaptureExposureModeContinuousAutoExposure и установил вспышку в TorchMode. Затем я запустил UnlockForConfiguration и установил наблюдателя с ключом, чтобы следить за настройкой Exposure. Затем я снова закрою устройство, переверну его на AVCaptureExposureModeLocked и выключите факел. Это приводит к тому, что грубая сила устанавливает более короткую скорость затвора, чем то, что камера выбрала бы на неосвещенной сцене. Играя с уровнем Факела, я могу установить любое относительное значение скорости затвора, которое я хочу (лучше было бы оставить факел, но в моем приложении он производит блики по объекту). Опять же, это действительно работает, когда расстояние до объекта очень близко (меньше, чем на 6 дюймов), но это позволило мне устранить размывание рукопожатия на моих снимках крупным планом. Нижняя сторона заключается в том, что изображения темнее, поскольку у меня нет возможности подменять коэффициент усиления камеры, но не проблема в моем конкретном приложении.

Ответ 3

Похоже, что они обновили этот связанный текст - нет упоминания о новых API для воздействия:

Используйте мощные новые функции встроенной камеры. Новые API поддерживают стабилизацию видео в реальном времени, улучшенную светодиодную вспышку, обнаружение и отображение лиц. Вы можете получать отчеты о потерянных кадрах во время захвата и использовать новые утилиты для сопоставления пользовательских интерфейсов для фокусировки и выдержки. Приложения, поддерживающие iPhone 5, могут использовать режим пониженного освещения.

В iPhone 5 включен режим пониженного освещения, подробный здесь Джим Роадес (и в этот пост форума разработчиков, требуется вход в систему).

Ответ 4

В качестве продолжения замечательной информации Майкла Гринича я обнаружил, что существует зависимость порядка от некоторых вызовов в частном API. Чтобы использовать "ручные" элементы управления экспозицией, вы должны включить их, прежде чем устанавливать режим, например:

#define AVCaptureExposureModeManual     3
NSError*    error = nil;
if ([captureDevice lockForConfiguration:&error]) {
    captureDevice.manualExposureSupportEnabled = YES;
    if ([captureDevice isExposureModeSupported:AVCaptureExposureModeManual]) {
        captureDevice.exposureMode = AVCaptureExposureModeManual;
        captureDevice.exposureGain = ...;
        captureDevice.exposureDuration = {...};
    }
    [captureDevice unlockForConfiguration];
}

Все это показано в iOS-ManualCamera.