【发布时间】:2019-04-04 00:23:00
【问题描述】:
我有一个 camera2 实现。当前的设置是,它使用纹理视图表面来显示实际的相机视图,并使用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")
}
ImageReaders的初始化是这样的。
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。 - 图片尺寸基于最佳尺寸
- 它可以单独与任何一个图像阅读器配合使用,但一旦我将两者加在一起,就会出现空白屏幕!
- 在装有 Android Oreo (8.0) 的三星 Galaxy S8 上进行测试
【问题讨论】:
标签: android kotlin android-camera2