我有一个相机2的实现。当前设置是,它使用纹理视图表面来显示实际的相机视图,并使用一个
现在我想要捕获预览帧。所以我尝试添加一个新的
图像读取器的初始化如下所示。
ImageReader
表面来捕获图像。现在我想要捕获预览帧。所以我尝试添加一个新的
ImageReader
表面来捕获帧。但是当我将该表面添加到createCaptureSession
请求中时,屏幕变空白了。可能出了什么问题?下面是我用来向createCaptureSession
添加表面的代码。val surface = preview.surface
?: throw CameraAccessException(CameraAccessException.CAMERA_ERROR)
val previewIRSurface = previewImageReader?.surface
?: throw CameraAccessException(CameraAccessException.CAMERA_ERROR)
val captureSurface = captureImageReader?.surface
?: throw CameraAccessException(CameraAccessException.CAMERA_ERROR)
try {
val template = if (zsl) CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG else CameraDevice.TEMPLATE_PREVIEW
previewRequestBuilder = camera?.createCaptureRequest(template)
?.apply { addTarget(surface) }
?: throw CameraAccessException(CameraAccessException.CAMERA_ERROR)
val surfaces: ArrayList<Surface> = arrayListOf(surface, previewIRSurface, captureSurface)
camera?.createCaptureSession(surfaces, sessionCallback, backgroundHandler)
} catch (e: CameraAccessException) {
throw RuntimeException("Failed to start camera session")
}
图像读取器的初始化如下所示。
private fun prepareImageReaders() {
val largestPreview = previewSizes.sizes(aspectRatio).last()
previewImageReader?.close()
previewImageReader = ImageReader.newInstance(
largestPreview.width,
largestPreview.height,
internalOutputFormat,
4 // maxImages
).apply { setOnImageAvailableListener(onPreviewImageAvailableListener, backgroundHandler) }
val largestPicture = pictureSizes.sizes(aspectRatio).last()
captureImageReader?.close()
captureImageReader = ImageReader.newInstance(
largestPicture.width,
largestPicture.height,
internalOutputFormat,
2 // maxImages
).apply { setOnImageAvailableListener(onCaptureImageAvailableListener, backgroundHandler) }
}
以上使用的参数的更多澄清:
internalOutput
格式为ImageFormat.JPEG
或ImageFormat.YUV_420_888
。- 图像大小基于最佳可能大小。
- 单独使用任一图像阅读器均可正常工作,但只要将两者结合起来使用,屏幕就会变成空白!
- 在安卓 Oreo (8.0) 上的三星 Galaxy S8 进行测试。
internalOutputFormat
是ImageFormat.JPEG
,我也尝试过使用ImageFormat.YUV_420_888
,但结果相同。此外,maxImages = 4
在这种情况下是安全的,因为只有在完成当前帧后才会请求下一帧。如果我不使用另一个图像读取器,两个图像读取器都可以单独工作。但是一起使用时只有空白屏幕。我想知道设备是否相关。如果是这样,我正在测试Android 8.0
上的Samsung Galaxy S8
。 - priyankStream configuration failed due to: endConfigure:434
,但在搜索后发现,JPEG格式不支持多个表面。将其更改为YUV_420_888
后,它可以完美地工作。 - priyank