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

Seb*_*arr 4 iphone camera objective-c avfoundation ios

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

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

系统可以连续调整割炬,如文档所述

捕获设备持续监控光照水平,并在必要时使用割炬.

适用于iOS 4.0及更高版本.

bll*_*akk 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];
}
Run Code Online (Sandbox Code Playgroud)

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

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