我有一个Android camera2 API 预览,它在Kotlin中使用suspendCoroutine在所有表面设置和回调中正常运行。但是当我尝试在应用启动5秒后尝试拍照(TEMPLATE_STILL_CAPTURE,YUV_420_888,最小分辨率)时,由于一时(甚至在预览窗口中)全黑,我得到了一张充满0-的YUV图像lum像素。
private suspend fun captureStill(): Image = suspendCoroutine { cont ->
val captureRequestStill = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE)
captureRequestStill.addTarget(imageReaderYUV.surface)
imageReaderYUV.setOnImageAvailableListener({ cont.resume(imageReaderYUV.acquireLatestImage()) }, backgroundHandler)
cameraCaptureSession.capture(captureRequestStill.build(), null, backgroundHandler)
}
我想念什么吗?我是否早些修改了设置的某些方面? setOnImageAvailableListener是否无法捕获YUV图像?
答案 0 :(得分:0)
在设置相机预览时,您隐式选择了一些预览尺寸。一般而言,您的捕获可以使用不同的大小(甚至是YUV,它实际上也是预览缓冲区)。
但是在许多设备上,预览和捕获大小的不协调选择并不奏效。常见的现象是您必须选择预览大小和Jpeg捕获大小以具有相同的宽高比。我强烈建议您也对YUV遵循这种做法。
如果要保持TextureView大小适合常规布局,可以使用SurfaceTexture.setDefaultBufferSize。