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

时间:2012-09-28 07:23:41

标签: iphone ios camera avcapturedevice

在Apple的iOS 6.0 feature page上,它曾经说过

  

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

此文本已被删除,我无法在API中找到用于控制曝光的新方法。在“曝光设置”下的课程AVCaptureDevice中,没有针对iOS 6.0的新属性/方法。您知道在哪里可以找到API中的曝光新功能吗?

5 个答案:

答案 0 :(得分:23)

-exposureMode上有一个AVCaptureDevice属性,但这仅适用于设置模式(关/自动/连续)而非实际f-停止,SS或ISO。提供"曝光的相机应用程序"控制所有人似乎都是通过后期处理来完成的。

但是,框架中似乎没有未记录的API来执行此操作。查看full headers for AVCaptureDevice.h(通过class-dump)并注意以下方法:

- (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等效f-stop(固定光圈),duration是快门速度。我想知道这些是否用于iPhone 5 low-light boost mode

你也可以使用otool来寻找并尝试拼凑符号。 exposureMode中可能有一个新常量用于启用手动控制,而exposureDuration似乎也有标记。在调用这些内容时,请务必使用新的-isExposureModeSupported:并调用-respondsToSelector:来检查兼容性。

与往常一样,Apple不赞成使用私有API,这是App Store拒绝的原因。可能有一些解决方法,例如使用-performSelector:obc_msgsend隐藏使用rot13字符串或其他内容的调用,因为我非常确定他们只对应用二进制文件进行静态分析。

答案 1 :(得分:4)

我设法“欺骗”相机运行较短的曝光时间,但我怀疑它只对那些进行类似(宏)图像采集的人有用。我首先设置AVCaptureDevice以使用AVCaptureExposureModeContinuousAutoExposure并将flash设置为TorchMode。然后我解锁ForConfiguration并设置一个键值观察器来监视adjustExposure完成。然后我重新锁定设备,翻转到AVCaptureExposureModeLocked,然后关闭Torch。这具有蛮力设置比在未照明场景中相机选择的快门速度更短的效果。通过玩火炬等级,我可以设置我想要的任何相对快门速度值(当然最好让火炬开启,但在我的应用中它会对主体产生眩光)。再次,只有当物体距离非常接近(小于6英寸)时,这才真正起作用,但它允许我消除特写图像中的手抖模糊。缺点是图像较暗,因为我没有办法欺骗相机增益,但在我的特定应用中没有问题。

答案 2 :(得分:3)

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

  

使用内置相机的强大新功能。新的API支持实时视频稳定,改进的LED闪光灯,以及人脸检测和显示。您可以获取捕获期间丢帧的报告,并利用新的实用程序将UI触摸映射到焦点和曝光命令。支持iPhone 5的应用程序可以利用低光增强模式。

适用于iPhone 5的选择性弱光提升模式,详细here by Jim Rhoades(以及this developer forum post,需要登录)。

答案 3 :(得分:3)

作为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中得到证明。

答案 4 :(得分:1)

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

请参阅Apple文档中的setExposureModeCustomWithDuration等。

Here is an article discussing how to use the APIs.