AVCaptureTorchModeAuto不会持续更新手电筒模式

时间:2014-04-10 20:35:05

标签: ios objective-c iphone camera avfoundation

我正在编写一个应用程序,根据照明条件自动打开iOS设备背面的手电筒。该应用程序呈现实时摄像机视图,但不记录视频。

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

可以让系统连续调整割炬,如the documentation

中所述
  

捕捉设备持续监控灯光亮度,并在必要时使用割炬。

     

适用于iOS 4.0及更高版本。

3 个答案:

答案 0 :(得分:5)

使用当前的API集,亮度采样仅在录制开始时完成。因此AVCaptureTorchModeAuto无法正常工作。


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

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

一旦火炬出现,对捕获的流的分析将无法分辨房间亮度的当前情况,因为火炬将导致化妆品亮度。

因此,为了获得真正的亮度值,必须要及时切换开关,这在大多数情况下不是非常通用和方便

获取亮度值以决定是否启用Torch。

- (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: 使用前置摄像头进行亮度检测:

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

答案 1 :(得分:0)

您可以参考this question了解打开闪光灯的不同方法。我相信AVCaptureTorchModeAuto仅在拍摄视频时有效。但是,你可以尝试不同的东西:

1)使用NSTimer每秒拍摄一张静止图像(如果你发现没有快门声的方法)

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

3)计算所需的亮度级别并通过调用进行设置 setTorchModeOnWithLevel:error:方法。

答案 2 :(得分:0)

尝试回答我自己的问题:

系统只在视频捕捉开始时设置一次火炬模式。持续监控亮度水平会导致割炬无休止地开启和关闭,因为割炬打开时照明条件总是完美的,而割炬关闭则太暗。由于测量和动作(打开手电筒)相互影响,系统无法知道没有割炬的画面有多亮。

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