代码之家  ›  专栏  ›  技术社区  ›  Deepak Sharma

AVCaptureDevice TemperatureAndIntValues崩溃

  •  -1
  • Deepak Sharma  · 技术社区  · 5 年前

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

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

    然后在观察值(…)中,我这样做:

       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 {
    
                   }
         }
    
      }
    

    问题是在这种情况下,更改值总是为零。为什么?

    0 回复  |  直到 5 年前
        1
  •  1
  •   matt    5 年前

    这是 documentation :

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

    所以看起来你可能会得到一个例外,医生特别告诉你可能会得到。

    同一节告诉您如何避免出现异常:

    对于whiteBalanceGains结构中的每个通道,只有介于1.0和 maxWhiteBalanceGain 得到支持。

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