AVCaptureTorchModeAuto不会持续更新火炬模式

我正在写一个应用程序,根据照明条件自动打开iOS设备背面的手电筒。 该应用呈现实时相机视图,并且不loggingvideo。

我曾尝试使用AVCaptureTorchModeAuto ,但它似乎只是在拍摄会话开始时测量图像的亮度,并相应地设置了手电筒。 然后,不pipe摄像机图像的亮度如何,设置都不会改变。

如文件中所述 ,系统可以持续调整割炬吗?

捕捉设备持续监控光照水平,并在必要时使用手电筒。

在iOS 4.0及更高版本中可用。

使用当前的一组API,亮度采样只在logging开始时完成。 所以AVCaptureTorchModeAuto不能像你期望的那样工作。


现在讨论这个问题中讨论的用例:

可能性1:使用后置摄像头进行亮度检测:

一旦火炬出现,分析捕获的stream不会告诉当前的房间亮度情况,因为火炬会造成美观的亮度。

所以为了得到真正的亮度值,就要及时的开关,这在大多数情况下不是非常通用和方便的

获取亮度值来决定是否启用火炬。

 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { CFDictionaryRef metadataDict = CMCopyDictionaryOfAttachments(NULL, sampleBuffer, kCMAttachmentMode_ShouldPropagate); NSDictionary *metadata = [[NSMutableDictionary alloc] initWithDictionary:(__bridge NSDictionary*)metadataDict]; CFRelease(metadataDict); NSDictionary *exifMetadata = [[metadata objectForKey:(NSString *)kCGImagePropertyExifDictionary] mutableCopy]; float brightnessValue = [[exifMetadata objectForKey:(NSString *)kCGImagePropertyExifBrightnessValue] floatValue]; } 

可能性2:使用前置摄像头进行亮度检测:

前置摄像头不允许使用手电筒。

你可以参考这个问题来开启闪光灯的不同方式。 我相信AVCaptureTorchModeAuto只能在捕捉video时使用。 不过,你可以尝试一些不同的东西:

1)使用NSTimer每秒捕捉一个静止图像(如果你find一种方法来做到这一点没有快门声)

2)将该图像转换成HSB,并通过获得每个像素的B分量并计算平均值来获得其平均亮度

3)计算所需的亮度级别,并通过调用setTorchModeOnWithLevel:error: method来设置它。

试着回答我自己的问题:

系统在video捕捉开始时只设置一次火炬模式是有意义的。 不断监测亮度水平会导致割炬无休止地开启和closures,因为照明条件在割炬开启时总是完美的,在割炬closures的情况下太暗。 由于测量和动作(开启火炬)相互影响,系统不知道没有火炬的情况下图像会有多亮。

因此,这似乎是非常好的行为,我原来的问题是错误的措词。