AVCaptureSession的亮度值不一致

时间:2015-10-30 17:38:43

标签: ios camera avcapturesession brightness

我正在尝试使用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()

但这似乎没有奏效。我真的无法弄清楚是什么导致了它。

由于

1 个答案:

答案 0 :(得分:2)

我的回答可能差不多一年了,但它仍然可能对某些人有帮助。看起来你没有尝试设置ISO。如果您使用:

device.setExposureModeCustomWithDuration(AVCaptureExposureDurationCurrent, iso: iso, completionHandler: nil) 

然后你可以设置ISO,它应该阻止亮度值变化太大。

一些额外的提示,请确保您只执行一次此操作,否则您的值将在第二次调用后再次不一致。在调用上述方法之前,您还必须首先锁定设备以进行配置。