【问题标题】:AVCaptureTorchModeAuto does not continuously update torch modeAVCaptureTorchModeAuto 不会持续更新手电筒模式
【发布时间】:2014-04-10 20:35:04
【问题描述】:

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

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

可以让系统连续调整手电筒,如the documentation中所述?

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

适用于 iOS 4.0 及更高版本。

【问题讨论】:

  • 你找到答案了吗?
  • 我认为AVCaptureTorchModeAuto 只会在你录制时打开手电筒。
  • @adam10603: AVCaptureTorchModeAuto 仅在存在AVCaptureVideoDataOutput 时有效。然而,光照水平的监测只在开始时发生,而不是“持续”发生。
  • 这也是有道理的,因为一旦 Torch 开启,他们就无法检测到真实情况,因此它会缺乏一致性。因此,他们可能的意思是,它会在您开始录制之前持续监控光照水平的变化。
  • 同意Torch打开后不连续监控是有道理的,但是当在明亮的区域开始录制时,当手电筒关闭时如何,然后人移动到黑暗的房间,应该不是现在自动打开 Torch,然后从那时起停止监视吗?

标签: ios objective-c iphone camera avfoundation


【解决方案1】:

使用当前的 API 集,亮度采样仅在录制开始时进行。因此 AVCaptureTorchModeAuto 无法按预期工作。


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

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

一旦手电筒出现,对捕获的流的分析将无法说明房间亮度的当前情况,因为手电筒会导致外观亮度。

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

获取亮度值来决定是否启用 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: 使用前置摄像头进行亮度检测:

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

【讨论】:

    【解决方案2】:

    您可以参考this question了解不同的闪光灯开启方式。我相信AVCaptureTorchModeAuto 仅在捕获视频时有效。但是,您可以尝试不同的方法:

    1) 使用NSTimer 每秒捕获一张静止图像(如果您找到一种无需快门声的方法)

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

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

    【讨论】:

      【解决方案3】:

      尝试回答我自己的问题:

      系统只在视频捕获开始时设置一次手电筒模式是有意义的。持续监控亮度水平会导致手电筒无休止地打开和关闭,因为手电筒打开时照明条件总是完美的,而手电筒关闭时照明条件太暗。系统不知道没有手电筒的情况下图片有多亮,因为测量和操作(打开手电筒)会相互影响。

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

      【讨论】:

        猜你喜欢
        • 2014-01-29
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多