访问iOS 6新的API用于相机曝光和快门速度

在苹果的iOS 6.0function页上 ,它曾经说过

利用内置相机的高级function。 新的API可让您控制焦点,曝光和感兴趣的区域。 您还可以使用面部检测API访问和显示人脸,并利用支持硬件的video稳定function。

这段文字已经被删除了,我无法在API中find控制曝光的新方法。 在“Exposure Settings”下的AVCaptureDevice类中,iOS 6.0没有新的属性/方法。 你知道我在哪里可以find暴露在API中的新function?

的确, AVCaptureDevice上有一个-exposureMode属性,但这只是设置模式(off / auto / continuous)而不是实际的f-stop,SS或ISO。 提供“曝光”控制的相机应用似乎都是通过后期处理来完成的。

但是,在框架中似乎有没有记载的API来做到这一点。 查看AVCaptureDevice.h的完整标题 (通过类转储 )并记下以下方法:

 - (void)setManualExposureSupportEnabled:(BOOL)arg1; - (BOOL)isManualExposureSupportEnabled; - (void)setExposureGain:(float)arg1; - (float)exposureGain; - (void)setExposureDuration:(struct { long long x1; int x2; unsigned int x3; long long x4; })arg1; - (struct { long long x1; int x2; unsigned int x3; long long x4; })exposureDuration; - (void)setExposureMode:(int)arg1; - (int)exposureMode; - (BOOL)isExposureModeSupported:(int)arg1; 

我的猜测是gain是等效的光圈(固定光圈), duration是快门速度。 我不知道这些是否用于iPhone 5的弱光升压模式 。

您也可以使用otool四处otool并尝试拼凑符号。 在用于手动控制的exposureMode ,可能会有一个新的常数,而且exposureDuration看起来也像是有标志。 在调用这些时,请确保使用新的-isExposureModeSupported:并且还调用-isExposureModeSupported: -respondsToSelector:来检查兼容性。

与往常一样,使用私有API是苹果不赞成的,并且是被App Store拒绝的原因。 有可能是有办法解决这个问题,比如隐藏调用使用-performSelector:obc_msgsend rot13string或什么的,因为我敢肯定,他们只对应用程序二进制文件进行静态分析。

我已经设法“欺骗”相机,使其运行更短的曝光时间,但我怀疑这只会对那些做相似(macros观)图像获取的人有用。 我首先设置AVCaptureDevice使用AVCaptureExposureModeContinuousAutoExposure并将闪光灯设置为TorchMode。 然后我UnlockForConfiguration并设置一个键值观察者来监视adjustExposure完成。 然后我重新locking设备,翻转到AVCaptureExposureModeLocked,并closures火炬。 这具有蛮力设定的快门速度比照相机在未照亮的场景上select的更快的效果。 通过使用火炬等级,我可以设置任何我想要的相对快门速度值(这当然是最好的离开火炬,但在我的应用程序,它产生的主题眩光)。 再次,这只有当你的物体距离非常接近(小于6英寸)时才有效,但它可以让我消除特写图像中的手抖动。 不好的一面是图像比较暗,因为我没有欺骗摄像机增益的方法,但在我的特定应用中不是问题。

看起来他们已经更新了链接的文字 – 没有提及曝光的新API:

使用内置相机的强大的新function。 新的API支持实时video稳定,改进的LED闪光灯,人脸检测和显示。 您可以在捕捉过程中获得丢帧的报告,并利用新的实用程序将UI触摸映射到焦点和曝光命令。 而支持iPhone 5的应用程序可以利用弱光提升模式。

有一个适用于iPhone 5的select性低光照提升模式, 在这里由Jim Rhoades详细说明(在此开发者论坛post中 ,需要login)。

作为Michael Grinich出色的信息的后续工作,我发现私有API中的一些调用依赖于订单。 要使用“手动”曝光控制,您必须设置模式之前启用它们,如下所示:

 #define AVCaptureExposureModeManual 3 NSError* error = nil; if ([captureDevice lockForConfiguration:&error]) { captureDevice.manualExposureSupportEnabled = YES; if ([captureDevice isExposureModeSupported:AVCaptureExposureModeManual]) { captureDevice.exposureMode = AVCaptureExposureModeManual; captureDevice.exposureGain = ...; captureDevice.exposureDuration = {...}; } [captureDevice unlockForConfiguration]; } 

所有这些都在iOS-ManualCamera中演示。

从iOS 8.0开始,现在终于可以实现了。

请参阅Apple文档中的setExposureModeCustomWithDuration等。

这里有一篇文章讨论如何使用API​​。