gpt4 book ai didi

安卓相机2 API。设置多个 ImageReader 表面会产生空白输出

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:42 26 4
gpt4 key购买 nike

我有一个 camera2 实现。当前的设置是,它使用纹理 View 表面来显示实际的相机 View ,并使用 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")
}

ImageReader的初始化是这样的。

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.JPEGImageFormat.YUV_420_888
  • 图片尺寸基于最佳尺寸
  • 单独使用其中一个图像阅读器效果很好,但一旦我将两者加在一起,就会出现黑屏!
  • 在装有 Android Oreo (8.0) 的三星 Galaxy S8 上进行测试

原始代码在这里https://github.com/pvasa/cameraview-ex/blob/development/cameraViewEx/src/main/api21/com/priyankvasa/android/cameraviewex/Camera2.kt

最佳答案

ma​​xImages == 4 可能太多了,会耗尽您的 RAM。此外,不清楚您使用的是什么internalOutputFormat,以及它是否与largestPreview 大小兼容。

底线是,研究 createCaptureSession() 支持的表面列表参数的长表列表.根据您的相机功能,您使用的三个表面可能太多了。

从下面的评论中,一个可行的解决方案:“错误本身并没有说明太多 [...] 但在搜索时,发现 JPEG 格式不支持多个表面。将其更改为YUV_420_888 完美运行。”

关于安卓相机2 API。设置多个 ImageReader 表面会产生空白输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53308362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com