Android camera2 api.Установка нескольких поверхностей ImageReader дает пустой вывод - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть реализация 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.
  • Размеры изображения основаны на наилучших возможных размерах
  • Работает хорошос любым из считывателей изображений по отдельности, но как только я добавлю оба вместе, пустой экран!
  • Тестирование на Samsung Galaxy S8 с Android Oreo (8.0)

Оригиналкод здесь https://github.com/pvasa/cameraview-ex/blob/development/cameraViewEx/src/main/api21/com/priyankvasa/android/cameraviewex/Camera2.kt

1 Ответ

0 голосов
/ 15 ноября 2018

maxImages == 4 может быть слишком много и исчерпать вашу оперативную память. Кроме того, неясно, какой internalOutputFormat вы используете, и совместим ли он с размером largePreview .

Суть в том, чтобы изучить длинный список таблиц для поддерживаемого параметра списка поверхностей для createCaptureSession () . В зависимости от возможностей вашей камеры, три поверхности, которые вы используете, могут быть слишком много.

Из комментариев ниже, рабочее решение: "Сама ошибка не говорит о многом [...], но при поиске обнаруживается, что несколько форматов не поддерживаются для формата JPEG. При изменении на YUV_420_888 работает без нареканий. "

...