我正在做一个项目,我需要不断地以一定的分辨率、质量和等待时间拍摄照片。用户可以开始/停止图片的捕捉,用户也可以在预览或不预览的情况下运行它(就像用他的手机做其他事情一样)。
对于大多数设备,我大部分时间都可以正常工作,但在某些奇怪的情况下,我会看到糟糕/模糊的图片。值得一提的是,该设备正在移动。
这是我目前的要求:
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 的原因。
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,null, cameraHandler)
当onImageAvailable
被调用时,我再次捕获。有时我会保存图像,但如果捕获是在等待期间,我就让它继续。通常等待时间为400ms。
我的问题是:
- 我的照片有时模糊,有时不模糊(在同一个捕获会话中)是否有需要改进的地方?
- 类似型号的手机(SM-A705FN)给出的结果不一致。当另一部手机提供良好效果时,同一部手机会提供部分模糊的图像。相机的硬件是否可能被过度使用?
- 在某些手机中,相机会停止拍照,而不会调用相机错误回调。有没有办法知道我的照片在某个地方丢失了?
- 在某些手机中,我的代码根本不起作用,例如三星 A7,但它适用于三星 A10(功能较弱)
PS:我使用具有几乎相同请求参数的repeatingRequest,但发现即使输出稍高(照片拍摄得更快),质量也较差。