Cámara iOS: duración manual de la exposition pero ¿ISO auto?

Estoy usando la alimentación de video de la camera para el procesamiento de algunas imágenes y me gustaría optimizar la velocidad de obturación más rápida. Sé que puedes configurar manualmente la duración de la exposition y la ISO utilizando

setExposureModeCustomWithDuration:ISO:completionHandler: 

pero esto requiere que uno establezca ambos valores a mano. ¿Hay algún método o truco inteligente que le permita establecer la duracción de la exposition manualmente, pero tiene el control ISO en sí mismo para tratar de exponer correctamente la image?

No estoy seguro de si esta solución es la mejor, ya que estaba luchando con esto como estabas. Lo que he hecho es escuchar los cambios en el desplazamiento de exposition y, de ellos, ajustar el ISO hasta llegar a un nivel de exposition aceptable. La mayor parte de este código se ha tomado del código de muestra de Apple

Entonces, en primer lugar, escuchas los cambios en el ExposureTargetOffset. Agregue en su statement de class:

static void *ExposureTargetOffsetContext = &ExposureTargetOffsetContext;

Luego, una vez que haya hecho la configuration de su dispositivo correctamente:

[self addObserver:self forKeyPath:@"captureDevice.exposureTargetOffset" options:NSKeyValueObservingOptionNew context:ExposureTargetOffsetContext];

(En lugar de captureDevice, use su propiedad para el dispositivo) A continuación, implemente en su class la callback para 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]; } } } } 

Con este código, la velocidad del obturador se mantendrá constante y la ISO se ajustará para no dejar la image demasiado bajo o sobreexpuesta.

No olvide retirar al observador cuando lo necesite. Espero que esto te convenga.

¡Aclamaciones!