AVCaptureDevice温度和TintValues崩溃



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

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

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

以下是文档:

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

因此,看起来您可能会遇到文档特别告诉您可能会出现的异常。

同一节告诉你如何避免出现这种异常:

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

您可能需要为此添加一个检查。

最新更新