Я не уверен, что это решение является лучшим, поскольку я боролся с этим, как и вы. Я сделал это, чтобы прослушать изменения смещения экспозиции и от них настроить ISO до тех пор, пока вы не достигнете приемлемого уровня экспозиции. Большая часть этого кода взята из примера кода Apple
Итак, прежде всего, вы слушаете изменения в ExposureTargetOffset. Добавить в вашем объявлении класса:
static void *ExposureTargetOffsetContext = &ExposureTargetOffsetContext;
Затем, после того как вы сделали свою установку устройства правильно:
[self addObserver:self forKeyPath:@"captureDevice.exposureTargetOffset" options:NSKeyValueObservingOptionNew context:ExposureTargetOffsetContext];
(вместо captureDevice, используйте свойство для устройства) Затем осуществить в вашем классе обратный вызов для KVO:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if (context == ExposureTargetOffsetContext){
float newExposureTargetOffset = [change[NSKeyValueChangeNewKey] floatValue];
NSLog(@"Offset is : %f",newExposureTargetOffset);
if(!self.device) return;
CGFloat currentISO = self.device.ISO;
CGFloat biasISO = 0;
//Assume 0,3 as our limit to correct the ISO
if(newExposureTargetOffset > 0.3f) //decrease ISO
biasISO = -50;
else if(newExposureTargetOffset < -0.3f) //increase ISO
biasISO = 50;
if(biasISO){
//Normalize ISO level for the current device
CGFloat newISO = currentISO+biasISO;
newISO = newISO > self.device.activeFormat.maxISO? self.device.activeFormat.maxISO : newISO;
newISO = newISO < self.device.activeFormat.minISO? self.device.activeFormat.minISO : newISO;
NSError *error = nil;
if ([self.device lockForConfiguration:&error]) {
[self.device setExposureModeCustomWithDuration:AVCaptureExposureDurationCurrent ISO:newISO completionHandler:^(CMTime syncTime) {}];
[self.device unlockForConfiguration];
}
}
}
}
С этот код, выдержка затвора останется постоянной, и ISO будет настроен так, чтобы изображение не было слишком переэкспонировано или переэкспонировано.
Не забудьте удалить наблюдателя всякий раз, когда это необходимо. Надеюсь, это тебе подходит.
Cheers!
Большое спасибо! Я должен был пойти и узнать о КВО, но это, вероятно, было потрачено хорошо. Похоже, что это работает хорошо по большей части, хотя я в некоторых ситуациях освещения быстро размахиваю между двумя ISO. Вы разработали набор ценностей, которые работают плавно для вас? – Joe
Не могли бы вы прокомментировать, какой образец проекта из Apple вы использовали? – isaac
@isaac Извините, я должен был включить его сначала. Спасибо что подметил это. Пожалуйста, проверьте это [link] (https://developer.apple.com/library/ios/samplecode/AVCamManual/Introduction/Intro.html#//apple_ref/doc/uid/TP40014578-Intro-DontLinkElementID_2) – khose