ПОСЛЕ постукивать, чтобы сделать снимок, я хочу заблокировать экспозицию и выключить факел, как только экспозиция перестает корректироваться. Таким образом, я добавил наблюдатель обращаться adjustingExposure:AVFoundation - Как контролировать экспозицию
- (IBAction)configureImageCapture:(id)sender
{
[self.session beginConfiguration];
[self.cameraController device:self.inputDevice exposureMode:AVCaptureExposureModeAutoExpose];
[self.cameraController device:self.inputDevice torchMode:AVCaptureTorchModeOn torchLevel:0.8f];
[self.session commitConfiguration];
[(AVCaptureDevice *)self.inputDevice addObserver:self forKeyPath:@"adjustingExposure" options:NSKeyValueObservingOptionNew context:MyAdjustingExposureObservationContext];
}
Вот метод observeValueForKeyPath:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (context == MyAdjustingExposureObservationContext) {
if([keyPath isEqualToString:@"adjustingExposure"])
{
BOOL adjustingExposure = [ [change objectForKey:NSKeyValueChangeNewKey] isEqualToNumber:[NSNumber numberWithInt:1] ];
if (!adjustingExposure)
{
[(AVCaptureDevice *)self.cameraController.inputDevice removeObserver:self forKeyPath:@"adjustingExposure"];
if ([self.inputDevice isExposureModeSupported:AVCaptureExposureModeLocked]) {
dispatch_async(dispatch_get_main_queue(),
^{
NSError *error = nil;
if ([self.inputDevice lockForConfiguration:&error]) {
// 5) lock the exposure
[self.cameraController device:self.inputDevice exposureMode:AVCaptureExposureModeLocked];
// 6) turn off the Torch
[self.cameraController device:self.inputDevice torchMode:AVCaptureTorchModeOn torchLevel:0.0001f];
[self.inputDevice unlockForConfiguration];
}
});
}
}
}
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
@ user3115647 отправил эту information, что это именно то, что я пытаюсь сделать.
Но сделайте снимок ДО факел выключен.
Вот мой captureStillImageAsynchronouslyFromConnection: self.captureConnection completeHandler. Этот блок возникает после съемки изображения. Предполагается, что наблюдениеValueForKeyPath происходит, когда камера регулирует экспозицию до того, как изображение будет снято. Но мой факел не идет низко, прежде чем изображение будет снято. Либо это проблема синхронизации, либо я неправильно настраиваю конфигурацию камеры.
- (void)captureImage
{
// configureImageCapture has already been done
[self.stillImageOutput captureStillImageAsynchronouslyFromConnection:self.captureConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error)
{
if (imageSampleBuffer != NULL)
{
// Log the image properties
CFDictionaryRef attachmentsRef = CMGetAttachment(imageSampleBuffer, kCGImagePropertyExifDictionary, NULL);
NSDictionary *properties = (__bridge NSDictionary *)(attachmentsRef);
NSLog(@"Image Properties => %@", (properties.count) ? properties : @"none");
ОК. Я знаю, что этот вопрос касается как фокуса, так и экспозиции, но сначала я соглашусь на то, чтобы выставлять себя под воздействием экспозиции. Я нашел ответ на то, что я пытаюсь сделать с экспозицией здесь: http://stackoverflow.com/questions/12635446/accessing-ios-6-new-apis-for-camera-exposure-and-shutter-speed/20660981 # 20660981 – Patricia
У меня возникли проблемы с тем, чтобы KVO выполнял так, как ожидалось. Изображение снимается до выключения факела. – Patricia
Я обновил код до того, что у меня есть. Ищете какую-то помощь здесь. Заранее спасибо. – Patricia