Как указать экспозицию, фокус и баланс белого для записи видео?

У меня есть программа для съемки видео с параметрами по умолчанию, а экспозиция, фокус и баланс белого будут регулироваться автоматически при перемещении камеры. Хочу добавить в программу 2 кнопки: LOCK и PRESET. При нажатии кнопки LOCK экспозиция, фокус и баланс белого фиксируются, а их значения сохраняются как пользовательские настройки. Кнопка PRESET предназначена для установки пользовательских настроек камеры, чтобы убедиться, что мы можем снимать все видео с одинаковыми значениями экспозиции, фокуса и баланса белого.

Часть блокировки проста, мне просто нужно изменить режим, поэтому я хотел бы знать, есть ли способ получить и установить значения для экспозиции, фокуса и баланса белого.

Возьмем, к примеру, экспозицию. По умолчанию для параметра ExposureMode установлено значение AVCaptureExposureModeContinuousAutoExposure. Это означает, что когда я держу iPhone, чтобы снять видео, экспозиция будет регулироваться автоматически, чтобы мы могли четко видеть сцену в яркой или темной среде.

AVCaptureDevice* pCaptureDevice = [self videoDeviceWithPosition:AVCaptureDevicePositionBack];
[pCaptureDevice lockForConfiguration:nil];
[pCaptureDevice setExposureMode:AVCaptureExposureModeContinuousAutoExposure];
[pCaptureDevice unlockForConfiguration];

Когда кнопка LOCK нажата, я изменяю ExposureMode на AVCaptureExposureModeLocked, поэтому текущее значение экспозиции больше не будет изменяться.

[pCaptureDevice lockForConfiguration:nil];
[pCaptureDevice setExposureMode:AVCaptureExposureModeLocked];
[pCaptureDevice unlockForConfiguration];

Однако как мне получить значение экспозиции в тот момент, когда кнопка нажата? И что более важно, как я могу установить значение экспозиции обратно в AVCaptureDevice при нажатии PRESET.

Я искал на форуме и нашел только сообщение Майкла Гринича: Доступ к новым API iOS 6 для экспозиции камеры и скорости затвора. Я последовал его находке и попытался использовать частные API для получения и установки параметров ExposureGain и ExposureDuration, но обнаружил, что в режиме AVCaptureExposureModeContinuousAutoExposure эти два значения никогда не менялись, когда я перемещал камеру из темной среды в яркую (exposureGain = 1,0 и ExposureDuration = {1, 30, 1, 0}). И их установка никак не повлияла на экспозицию.

[pCaptureDevice lockForConfiguration:nil];
[pCaptureDevice setExposureMode:AVCaptureExposureModeLocked];
[pCaptureDevice setManualExposureSupportEnabled:YES];
NSLog(@"exposure gain: %f", [pCaptureDevice exposureGain]);
[pCaptureDevice setExposureGain:3.0];
NSLog(@"exposure gain: %f", [pCaptureDevice exposureGain]);
[pCaptureDevice unlockForConfiguration];

Может ли кто-нибудь помочь мне решить эту проблему? Большое спасибо заранее!


person Yang    schedule 20.01.2013    source источник
comment
вы узнали что-нибудь по этому поводу? Я тоже борюсь с тем же.   -  person Drew H    schedule 01.11.2013
comment
Добились ли вы успеха?   -  person Bhumit Mehta    schedule 09.06.2014


Ответы (2)


Я добавил ответ, который может помочь вам в доступе Новые API iOS 6 для экспозиции камеры и скорости затвора. Здесь я могу добавить немного больше деталей...

Установка фокуса вручную следует точно такой же схеме, которую я описал для настройки экспозиции. Это:

#define AVCaptureFocusModeManual     3
NSError*    error = nil;
if ([captureDevice lockForConfiguration:&error]) {
    captureDevice.manualFocusSupportEnabled = YES;
    if ([captureDevice isFocusModeSupported:AVCaptureFocusModeManual]) {
        captureDevice.focusMode = AVCaptureFocusModeManual;
        // this is a value [0..1]
        captureDevice.focusPosition = ...;
    }
    [captureDevice unlockForConfiguration];
}

Баланс белого, похоже, не имеет особого режима, как экспозиция и фокус. Не устанавливайте WhiteBalanceMode на заблокированный, но в противном случае кажется, что вы можете просто установить цветовую температуру:

// this is also a value [0..1]
captureDevice.whiteBalanceTemperature = ...;
person Bretton Wade    schedule 30.01.2014

Чтобы вручную установить фиксированное значение экспозиции и ISO, теперь вы можете сделать это:

[Device lockForConfiguration:nil];
[Device setExposureModeCustomWithDuration:CMTimeMake(5, 100) ISO:AVCaptureISOCurrent completionHandler:nil]; //currently set to 50ms for example
[Device unlockForConfiguration];

вы можете сослаться на документацию по нему здесь: https://developer.apple.com/reference/avfoundation/avcapturedevice/1624646-setexposuremodecustomwithduratio?language=objc

person Abhishek Ravi    schedule 24.05.2017