在 ios 中获取当前的自动对焦系统时崩溃

Crash while getting the current Autofocus system in ios

iphone6 介绍中有两种类型的焦点检测, 1.对比检测 2.相位检测

从iphone 6.6+开始使用相位检测。

我正在尝试获取当前的焦点系统

self.format = [[AVCaptureDeviceFormat alloc] init];
[self.currentDevice setActiveFormat:self.format];

AVCaptureAutoFocusSystem currentSystem = [self.format autoFocusSystem];
if (currentSystem == AVCaptureAutoFocusSystemPhaseDetection)
{
     [self.currentDevice addObserver:self forKeyPath:@"lensPosition"    options:NSKeyValueObservingOptionNew context:nil];
}
else if(currentSystem == AVCaptureAutoFocusSystemContrastDetection)
{
  [self.currentDevice addObserver:self forKeyPath:@"adjustingFocus" options:NSKeyValueObservingOptionNew context:nil];
}
else{
    NSLog(@"No observers added");
}

但现在它在下一行崩溃

AVCaptureAutoFocusSystem currentSystem = [self.format autoFocusSystem];

我找不到正确的崩溃描述。

您正在创建一些“AVCaptureDeviceFormat”,但默认情况下实际上没有设置任何内容。这只是无法使用的垃圾(这就是您崩溃的原因)。

每个捕获设备都可以使用一种或两种格式。

您可以通过执行以下操作来查看它们:

for (AVCaptureDeviceFormat *format in [self.currentDevice formats]) {
       CFStringRef formatName = CMFormatDescriptionGetExtension([format formatDescription], kCMFormatDescriptionExtension_FormatName);
       NSLog(@"format name is %@", (NSString *)formatName);
}

应该做的是决定您要使用哪个 AVCaptureDevice(例如前置摄像头、后置摄像头等),从 获取格式那个,然后设置[self.currentDevice setActiveFormat:self.format]”。

WWDC 2013 session "What's New in Camera Capture" 视频提供了有关如何执行此操作的更多信息。