问题描述
我正在一个项目中,我需要以一定的分辨率,质量和等待时间不断拍照。用户可以开始/停止捕获图片,还可以在预览或不预览的情况下运行图片(就像用手机进行其他操作一样)。
在大多数情况下,大多数时间,我都能正常工作,但是在某些奇怪的情况下,我看到的照片质量不好/模糊不清。值得一提的是,该设备正在移动。
这是我当前的请求:
private fun setRequestParams(builder: CaptureRequest.Builder) {
builder.set(CaptureRequest.BLACK_LEVEL_LOCK,false)
builder.set(CaptureRequest.CONTROL_AWB_LOCK,false)
builder.set(CaptureRequest.CONTROL_AWB_MODE,CaptureRequest.CONTROL_AWB_MODE_AUTO)
builder.set(CaptureRequest.CONTROL_AE_LOCK,false)
builder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON)
builder.set(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE,CaptureRequest.CONTROL_AE_ANTIBANDING_MODE_AUTO)
builder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION,0)
builder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,0)
builder.set(CaptureRequest.CONTROL_MODE,CaptureRequest.CONTROL_MODE_AUTO)
builder.set(CaptureRequest.COLOR_CORRECTION_MODE,CaptureRequest.CONTROL_MODE_AUTO)
builder.set(CaptureRequest.CONTROL_CAPTURE_INTENT,CaptureRequest.CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG)
builder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)
builder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,getRange())
builder.set(CaptureRequest.JPEG_QUALITY,pictureConfig.quality.toByte())
val capabilities = cameracharacteristics?.get(Cameracharacteristics.REQUEST_AVAILABLE_CAPABILITIES)
val isManualFocusSupported : Boolean? = capabilities?.contains(Cameracharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)
if (isManualFocusSupported != null && isManualFocusSupported ) {
builder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_OFF)
builder.set(CaptureRequest.LENS_FOCUS_disTANCE,0.0f)
}
}
如上所述,用户可以在前景或背景上捕获照片,为此我创建了3个请求,我意识到在某些手机中,如果没有链接的Surface,相机会自动关闭,这就是我使用dummyView的原因。 / p>
private val previewRequest: CaptureRequest by lazy {
captureSession!!.device.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW).apply {
addTarget(preview!!)
setRequestParams(this)
}.build()
}
private val backgroundPreviewRequest : CaptureRequest by lazy {
captureSession!!.device.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW).apply {
addTarget(dummyPreview!!)
}.build()
}
private val captureRequest: CaptureRequest by lazy {
captureSession!!.device.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE).apply {
addTarget(imageReader!!.surface)
setRequestParams(this)
}.build()
}
一切准备就绪后,我会拍照:
captureSession?.setRepeatingRequest(previewRequest,null,cameraPreviewHandler)
captureSession?.capture(captureRequest,cameraHandler)
调用onImageAvailable
时,我再次捕获。有时我会保存图像,但是如果捕获是在 waiting 期间,我就让它继续。通常等待时间为400毫秒。
我的问题是:
- 我的照片有时模糊不清,有时(在同一拍摄会话中)没有,请问有什么需要改进的地方吗?
- 类似型号的电话(SM-A705FN)给出的结果不一致。当另一部手机取得良好效果时,同一部手机会产生部分模糊的图像。相机的硬件是否可能被过度使用?
- 在某些手机中,相机会停止拍照,而不会调用相机错误回调。有没有办法知道我的照片在某处丢失了?
- 在某些手机中,我的代码根本无法工作,例如三星A7,但在三星A10(功能较弱)上却可以工作
PS:我使用的 repeatingRequest 具有几乎相同的请求参数,但发现即使输出稍高(拍摄速度更快),质量也较差。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)