使用 AVCaptureDevice.setTorchModeOn 的手电筒亮度控制表现非常不稳定

Sid*_*rma 5 iphone ios swift

在我查看的每个文档中,如果没有发生过热等情况,AVCaptureDevice's似乎setTorchModeOn0.0to获取一个值1.0并相应地设置亮度。但在我对 iPhone 11 的测试中,setTorchModeOn表现非常不稳定。

似乎每次后续调用都会setTorchModeOn根据上次亮度更改亮度。所以,如果你在调用device.setTorchModeOn(0.1)后调用device.setTorchModeOn(0.2),手电筒亮度不会增加,但基本上是关闭的。这在应用程序重新启动后仍然存在。手电筒不再工作了,因为我猜现在亮度太低(可能是 0.02),它甚至无法运行。

假设的小例子:

guard let device = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) else { return }

do {
  try device.lockForConfiguration()
  for i in stride(from: Float(0.5), to: 1.0, by: 0.1) {
    try device.setTorchModeOn(level: i)
    print(device.torchLevel, i)
    sleep(1)
  }
  device.unlockForConfiguration()
} catch { print(error) }
Run Code Online (Sandbox Code Playgroud)

在这段代码中,亮度没有增加,而是每秒都在减少。当您重新启动应用程序时,它以比第一次更低的亮度开始(与上次运行的最后一个亮度相同),然后降低到零,然后手电筒在应用程序中不起作用。即使我重新安装该应用程序,它也不起作用。系统手电筒和相机闪光灯继续工作。我能够将其重置的唯一方法是重新启动手机,或者在打开闪光灯的情况下单击相机应用程序中的照片。

我对此非常困惑。我是否必须重置设备的状态或以防止这种情况发生?我试图以特定模式上下改变手电筒的亮度,但感觉不可能再升高了。如果您发送的值超出 (0,1) 边界,则会引发异常。我尝试将它与AVCaptureDevice.maxAvailableTorchLevel也不能可靠地工作的混合。任何人都可以确认这也发生在他们身上吗?

PS:device.torchLevel似乎没有反映我发送的论点。相反,似乎也有奇怪的行为。上面代码的标准输出是:

0.0 0.5
0.0 0.6
0.0 0.7
0.0 0.8
0.0 0.9
Run Code Online (Sandbox Code Playgroud)

这两种情况都是如此。第一次运行,亮度降低5次,第二次运行,亮度开始低,在熄灭前降低一次。

在 iOS 13.4、Swift 5.2 上