Да, jpeg - король форматов изображений. Я имею в виду, что в сеансе захвата может быть только один JPEG или нет.
я есть реализация 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