AVCaptureDevice temperatureAndTintValues中的崩溃

问题描述 投票:-1回答:1

我有以下代码通过Swift中的KVO观察白平衡的变化。

   self.addObserver(self, forKeyPath: "videoInput.device.deviceWhiteBalanceGains", options: [.new, .old], context: &whitebalanceGainsObserverContext)

然后在observeValue(...)中,我这样做:

   if context == &whitebalanceGainsObserverContext {
        if let newNSValue = change?[.newKey] as? NSValue {
            var gains = AVCaptureDevice.WhiteBalanceGains()
            newNSValue.getValue(&gains)

            /* Crashes here on some devices in AppStore, throws an exception */
            let newTemperatureAndTint = self.videoInput?.device.temperatureAndTintValues(for: gains)

        }
   }

我永远无法重现崩溃,因此我想知道如何避免崩溃。我要进行哪些检查以避免抛出异常?

编辑:我也尝试如下使用新的观察API:

  deviceWBGainsObservation = observe(\.videoInput?.device.deviceWhiteBalanceGains, options: [.old, .new]) { (obj, change) in

        if let newNSValue = change.newValue {

        }

 }

甚至是这个,

  deviceWBGainsObservation = videoDevice?.observe(\.deviceWhiteBalanceGains, options: [.old, .new]) {[unowned self] (object, change) in

               if let newNSValue = change.newValue {

               }


               }

还有这个:

  private var videoDevice:AVCaptureDevice? {

     didSet {
        deviceWBGainsObservation = videoDevice?.observe(\.deviceWhiteBalanceGains, options: [.old, .new]) {[unowned self] (object, change) in

               if let newNSValue = change.newValue {

               }
     }

  }

问题是在这种情况下更改值始终为零。为什么呢?

ios avfoundation avcapturesession avcapturedevice
1个回答
0
投票

这里是documentation

如果任何whiteBalanceGains结构字段设置为不受支持的值,则此方法将引发invalidArgumentException异常。

所以看来您可能会收到文档明确告知您可能会收到的例外。

同一部分告诉您如何避免发生该异常:

对于whiteBalanceGains结构中的每个通道,仅支持1.0和maxWhiteBalanceGain之间的值。

您可能要为此添加一张支票。

© www.soinside.com 2019 - 2024. All rights reserved.