如何解决Android CameraX 获取当前的展示、焦点等
我想禁用所有自动功能,以便从相机获得稳定的信号
我尝试在相机启动后 5 秒内锁定 AE、AWB、黑电平颜色
.setCaptureRequestOption(CaptureRequest.CONTROL_AE_LOCK,true)
.setCaptureRequestOption(CaptureRequest.BLACK_LEVEL_LOCK,true)
.setCaptureRequestOption(CaptureRequest.CONTROL_AWB_LOCK,true)
它适用于 Pixel 4a,但不适用于启用了闪光灯的 Galaxy S7 - Galaxy S7 不会锁定 AE(禁用闪光灯时它会工作)。我试过设置
setCaptureRequestOption(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_OFF)
它适用于 S7,但不适用于 Pixel 4a。 Pixel 将曝光设置为最低,我看到几乎是黑屏。
setCaptureRequestOption(CaptureRequest.CONTROL_MODE,CaptureRequest.CONTROL_MODE_OFF_KEEP_STATE)
效果一样
现在我想尝试设置 CONTROL_MODE_OFF_KEEP_STATE 并设置当前的展示,所以它会被手动锁定。但是我找不到获取当前博览会的方法,我只能获取 SENSOR_INFO_EXPOSURE_TIME_RANGE
所以,我的问题是
是否可以在运行时获得当前曝光、焦点、灵敏度等?
解决方法
解决方案是Camera2Interop.setSessionCaptureCallback
result: TotalCaptureResult
中的参数 onCaptureCompleted
包含所有必需的数据
val builder = ImageAnalysis.Builder();
val camera2InterOp = Camera2Interop.Extender(builder)
camera2InterOp.setSessionCaptureCallback(object : CameraCaptureSession.CaptureCallback() {
override fun onCaptureCompleted(session: CameraCaptureSession,request: CaptureRequest,result: TotalCaptureResult) {
super.onCaptureCompleted(session,request,result)
if (!delayedParamsApplied && System.currentTimeMillis() - startTime > 5000) {
delayedParamsApplied = true
try {
val bundleBuilder =
CaptureRequestOptions.Builder()
.setCaptureRequestOption(CaptureRequest.CONTROL_AE_LOCK,true)
.setCaptureRequestOption(CaptureRequest.BLACK_LEVEL_LOCK,true)
.setCaptureRequestOption(CaptureRequest.CONTROL_AWB_LOCK,true)
getFocusDistance()?.let {
bundleBuilder.setCaptureRequestOption(CaptureRequest.LENS_FOCUS_DISTANCE,it)
}
result.get(CaptureResult.SENSOR_EXPOSURE_TIME)?.let {
bundleBuilder.setCaptureRequestOption(CaptureRequest.SENSOR_EXPOSURE_TIME,it)
}
result.get(CaptureResult.SENSOR_SENSITIVITY)?.let {
bundleBuilder.setCaptureRequestOption(CaptureRequest.SENSOR_SENSITIVITY,it)
}
result.get(CaptureResult.SENSOR_FRAME_DURATION)?.let {
bundleBuilder.setCaptureRequestOption(CaptureRequest.SENSOR_FRAME_DURATION,it)
}
bundleBuilder.setCaptureRequestOption(CaptureRequest.CONTROL_MODE,CaptureRequest.CONTROL_MODE_OFF_KEEP_STATE)
bundleBuilder.setCaptureRequestOption(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_OFF)
val bundle = bundleBuilder.build()
cameraControl.captureRequestOptions = bundle
} catch (t: Throwable) {
Timber.e(t)
}
}
}
})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。