Сбой в AVCaptureDevice температураAndTintValues - PullRequest
0 голосов
/ 28 октября 2019

У меня есть следующий код для наблюдения за изменениями баланса белого через 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 {

               }
     }

  }

Проблема в том, что в этом случае значение изменения всегда равно нулю. Почему это?

1 Ответ

1 голос
/ 29 октября 2019

Вот документация :

Этот метод генерирует исключение invalidArgumentException, если какое-либо из полей структуры whiteBalanceGains установлено в неподдерживаемые значения.

Похоже, что вы, возможно, получаете исключение, которое в документах специально вам было указано, что вы можете получить.

И в этом же разделе рассказывается, как избежать получения этого исключения:

Для каждогоканал в структуре whiteBalanceGains, поддерживаются только значения от 1,0 до maxWhiteBalanceGain.

Возможно, вы захотите добавить проверку для этого.

...