Доступ к новым 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.
Ответ 5
Начиная с iOS 8.0, теперь это возможно.
См. setExposureModeCustomWithDuration и т.д. в документации Apple.
Вот статья, в которой обсуждается, как использовать API.