我正在开发一个应用程序,该应用程序使用iOS 8中引入的新API公开相机的手动控件,我将使用WWDC 2014中的sample app作为参考。
然而,我注意到一个奇怪的行为(在我的5s和6上):在将曝光模式设置为“自定义”然后再回到“自动”后,图像继续滞后,好像曝光持续时间不受此影响变化
以下是每个步骤中涉及的代码(来自示例应用程序,未经任何修改):
- (IBAction)changeExposureMode:(id)sender
{
UISegmentedControl *control = sender;
NSError *error = nil;
AVCaptureExposureMode mode = (AVCaptureExposureMode)[self.exposureModes[control.selectedSegmentIndex] intValue];
if ([self.videoDevice lockForConfiguration:&error])
{
if ([self.videoDevice isExposureModeSupported:mode])
{
[self.videoDevice setExposureMode:mode];
}
else
{
NSLog(@"Exposure mode %@ is not supported. Exposure mode is %@.", [self stringFromExposureMode:mode], [self stringFromExposureMode:self.videoDevice.exposureMode]);
}
}
else
{
NSLog(@"%@", error);
}
}
- (IBAction)changeExposureDuration:(id)sender
{
UISlider *control = sender;
NSError *error = nil;
double p = pow( control.value, EXPOSURE_DURATION_POWER ); // Apply power function to expand slider's low-end range
double minDurationSeconds = MAX(CMTimeGetSeconds(self.videoDevice.activeFormat.minExposureDuration), EXPOSURE_MINIMUM_DURATION);
double maxDurationSeconds = CMTimeGetSeconds(self.videoDevice.activeFormat.maxExposureDuration);
double newDurationSeconds = p * ( maxDurationSeconds - minDurationSeconds ) + minDurationSeconds; // Scale from 0-1 slider range to actual duration
if (self.videoDevice.exposureMode == AVCaptureExposureModeCustom)
{
if ( newDurationSeconds < 1 )
{
int digits = MAX( 0, 2 + floor( log10( newDurationSeconds ) ) );
self.exposureDurationValueLabel.text = [NSString stringWithFormat:@"1/%.*f", digits, 1/newDurationSeconds];
}
else
{
self.exposureDurationValueLabel.text = [NSString stringWithFormat:@"%.2f", newDurationSeconds];
}
}
if ([self.videoDevice lockForConfiguration:&error])
{
[self.videoDevice setExposureModeCustomWithDuration:CMTimeMakeWithSeconds(newDurationSeconds, 1000*1000*1000) ISO:AVCaptureISOCurrent completionHandler:nil];
}
else
{
NSLog(@"%@", error);
}
}
答案 0 :(得分:0)
我也注意到了这一点。这似乎与低速快门有关。试试这个:转到自定义。设置快门速度。然后回到Auto。热潮,你就在那里。现在,转到自定义,设置慢速快门(滑块向右)。返回自动状态,您可以观看快门速度逐渐恢复到合理的设置。
示例代码和我根据示例代码编写的应用程序中就是这种情况。对于我的4s和5s来说也是如此。
我认为这是因为传感器需要捕获一定数量的图像才能选择正确的自动设置。快门速度非常慢(最长可达1秒),这意味着可能需要几秒钟才能找到正确的设置。有条不紊,即使不是我们想要的。对我来说幸运的是,我的应用程序永远不需要快门速度超过四分之一秒,如果那样的话。
答案 1 :(得分:0)
我在自己的代码中发现setExposureModeCustomWithDuration方法存在一些问题。虽然它有一个完成处理程序,它应该在设备的持续时间和ISO设置之后被调用,但它并不总是有效。 有时,例如从自动曝光切换到手动曝光时,如果从setExposureModeCustomWithDuration的完成处理程序中获取静止,则仍然使用自动曝光设置。如果您在此之后仍然使用另一个,则会在其上设置正确的手动曝光。
我发现完成处理程序开头的1秒延迟解决了这个问题,但这不是一个合适的解决方案。
我还尝试在完成处理程序的开头放置一个等待/睡眠循环,等待设备不调整曝光 - 这没有帮助。
答案 2 :(得分:0)
我尝试了相同的示例应用并尝试重现该问题,但无法看起来现在已经修复了它。