Android не может воспроизводить видео только аудио после использования camera2 API createCaptureSession

Версия Android: 5.1

Привет! Я заметил, что после того, как мое приложение использует camera2 API для созданияCaptureSession (моментальный снимок/запись), мое устройство Android больше не воспроизводит видео правильно, только звук с черный экран... и это не только мое приложение, во всех других потоковых приложениях возникает та же проблема. Мне нужно перезагрузиться, чтобы решить эту проблему. Кстати, мое устройство настроено таким образом, что я не могу использовать ADB, и эта проблема даже не возникает в моем симуляторе. Сейчас я просто понятия не имею, это убивает меня. Может кто-нибудь помочь мне, пожалуйста? Я буду признателен..!! Ниже показано, как я создаюCaptureSession и выпускаю. Может быть, что-то не так с моим кодом?

Снимок:

...after camera opened
                cameraDevice = p0;

                previewTextureListener = PreviewSurfaceTextureListener()

                cameraPreview.surfaceTextureListener = previewTextureListener
                
                cameraPreview.setTransform(transform)

...after previewTextureListenerAvailable 

                val captureWidth = 1920
                val captureHeight = 1080

                previewSurfaceTexture = surfaceTexture

                previewSurfaceTexture?.setDefaultBufferSize(captureWidth, captureHeight)

                previewSurface = Surface(previewSurfaceTexture)

                val sessionStateCallback = SessionStateCallback()

                imageReader = ImageReader.newInstance(captureWidth, captureHeight, ImageFormat.JPEG, 1)

                imageReader?.setOnImageAvailableListener(ImageAvailableCallback(), cameraHandler)

                imageSurface = imageReader?.surface

                val outputs = mutableListOf(previewSurface, imageSurface)

                cameraDevice?.createCaptureSession(outputs, sessionStateCallback, mainHandler)

...after sessionStateConfigured

            val requestBuilder = cameraDevice?.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)

            requestBuilder?.addTarget(previewSurface!!)

            val request = requestBuilder?.build()

            cameraCaptureSession?.setRepeatingRequest(request!!, PreviewImageCallback(), mainHandler)

записывать:


        // Start a capture session
        cameraDevice?.createCaptureSession(listOf(previewSurface, mediaRecorder?.surface), RecordSessionStateCallback(), cameraHandler)

... after RecordSessionConfigured

            val recordRequest = cameraDevice?.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);

            recordRequest?.addTarget(previewSurface!!);

            recordRequest?.addTarget(mediaRecorder?.surface!!)

            cameraRecordSession?.setRepeatingRequest(recordRequest?.build()!!, PreviewImageCallback(), cameraHandler)

Когда активность onDestroy:

        cameraPreview?.surfaceTextureListener = null

        cameraCaptureSession?.stopRepeating()

        cameraCaptureSession?.close()

        cameraDevice?.close()

        cameraDevice = null

person Yu Hung Hsu    schedule 30.10.2020    source источник


Ответы (1)


Без логов с устройства сложно сказать, но, скорее всего, что-то не так в стеке медиакодеков устройства. Это оставляет кодеки в плохом состоянии после того, как ваше приложение работает с MediaRecorder, требуя перезагрузки, прежде чем они снова заработают, либо для кодирования, либо для декодирования.

Возможно, это вызвано конкретными настройками, которые вы используете для MediaRecord, но на правильно сконструированном устройстве этого не должно происходить независимо от ваших настроек.

К сожалению, если это проблема, ее необходимо исправить в кодеке HAL для устройства, скорее всего, или в медиа-коде stagefright, если он был изменен из версии AOSP. Без логов невозможно узнать, что именно не так, но одной из возможностей может быть взаимоблокировка при отключении кодека.

person Eddy Talvala    schedule 30.10.2020