Android camera2 api. A configuração de várias superfícies do ImageReader fornece saída em branco

Eu tenho uma implementação camera2. A configuração atual é que ela usa uma superfície de visualização de textura para exibir a visualização real da câmera e umImageReaderuperfície para capturar imagen

Agora eu quero capturar quadros de visualização também. Então, tentei adicionar um novoImageReader superfície para capturar quadros. Mas quando adiciono essa superfície acreateCaptureSession request, a tela fica em branco. O que poderia estar errado? Abaixo está o código que eu uso para adicionar superfícies acreateCaptureSession

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")
}

A inicialização do ImageReaders é assim.

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) }
}

Mais esclarecimentos sobre os parâmetros usados acima:

internalOutput é o formatoImageFormat.JPEG ouImageFormat.YUV_420_888.s tamanhos de imagem são baseados nos melhores tamanhos possívei Funciona bem com qualquer um dos leitores de imagem individualmente, mas assim que adiciono os dois, a tela em branc Teste no Samsung Galaxy S8 com Android Oreo (8.0)

O código original está aquihttps: //github.com/pvasa/cameraview-ex/blob/development/cameraViewEx/src/main/api21/com/priyankvasa/android/cameraviewex/Camera2.k

questionAnswers(1)

yourAnswerToTheQuestion