我正在尝试使用didOutputSampleBuffer委托在使用iPhone前置摄像头的AVCapture会话期间从AVCaptureVideoDataOutput对象获取传递给AVCaptureVideoDataOutputSampleBufferDelegate的帧的亮度:
func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
let dict = CMGetAttachment(sampleBuffer, kCGImagePropertyExifDictionary, nil)
if let brightness = dict!["BrightnessValue"] as? Double {
print(brightness)
}
}
这个亮度必须一致。在一个会话中,亮度是一致的,但如果我以编程方式停止并重新启动会话,或者通过锁定设备/退出应用程序,那么亮度值似乎会发生变化。我的意思是,当我阻止相机时,我收到的亮度值在不同会话之间发生变化。
我已经尝试修复了我认为可能会影响明显亮度的所有相机设置:
try videoCaptureDevice.lockForConfiguration()
videoCaptureDevice.autoFocusRangeRestriction = AVCaptureAutoFocusRangeRestriction.None
videoCaptureDevice.smoothAutoFocusEnabled = false
videoCaptureDevice.setExposureTargetBias(0.5) { (CMTime) -> Void in
}
if videoCaptureDevice.lowLightBoostEnabled {
videoCaptureDevice.automaticallyEnablesLowLightBoostWhenAvailable = false
}
videoCaptureDevice.videoZoomFactor = 1.0
videoCaptureDevice.automaticallyAdjustsVideoHDREnabled = false
videoCaptureDevice.exposureMode = AVCaptureExposureMode.Locked
videoCaptureDevice.setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains(AVCaptureWhiteBalanceGains.init(redGain: 1.0, greenGain: 1.0, blueGain: 1.0), completionHandler: { (CMTime) -> Void in
})
videoCaptureDevice.setFocusModeLockedWithLensPosition(0.5) { (CMTime) -> Void in
}
videoCaptureDevice.unlockForConfiguration()
但这似乎没有奏效。我真的无法弄清楚是什么导致了它。
由于
答案 0 :(得分:2)
我的回答可能差不多一年了,但它仍然可能对某些人有帮助。看起来你没有尝试设置ISO。如果您使用:
device.setExposureModeCustomWithDuration(AVCaptureExposureDurationCurrent, iso: iso, completionHandler: nil)
然后你可以设置ISO,它应该阻止亮度值变化太大。
一些额外的提示,请确保您只执行一次此操作,否则您的值将在第二次调用后再次不一致。在调用上述方法之前,您还必须首先锁定设备以进行配置。