我正在编写一个应用程序,根据照明条件自动打开iOS设备背面的手电筒。该应用程序呈现实时摄像机视图,但不记录视频。
我尝试使用AVCaptureTorchModeAuto
,但它似乎只是在捕获会话开始时测量图像的亮度,并相应地设置手电筒。无论相机图像的亮度如何,之后设置都不会改变。
可以让系统连续调整割炬,如the documentation?
中所述捕捉设备持续监控灯光亮度,并在必要时使用割炬。
适用于iOS 4.0及更高版本。
答案 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)
尝试回答我自己的问题:
系统只在视频捕捉开始时设置一次火炬模式。持续监控亮度水平会导致割炬无休止地开启和关闭,因为割炬打开时照明条件总是完美的,而割炬关闭则太暗。由于测量和动作(打开手电筒)相互影响,系统无法知道没有割炬的画面有多亮。
因此,这似乎是非常好的行为,我原来的问题是错误的措辞。