Android 使用 camera2 后无法仅播放视频音频 API createCaptureSession

Android can't play video only audio after using camera2 API createCaptureSession

Android版本:5.1

嗨,我注意到 after 我的应用使用 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

如果没有来自设备的日志,很难判断,但很可能是设备的媒体编解码器堆栈出现问题。在您的应用使用 MediaRecorder 完成后,它会使编解码器处于不良状态,需要重新启动才能再次工作,以进行编码或解码。

您为 MediaRecord 使用的特定设置可能会触发此问题,但在正确构建的设备上,无论您的设置是什么,都不会发生这种情况。

不幸的是,如果这是问题所在,它需要在设备的编解码器 HAL 中修复,很可能,或者在 stagefright 媒体代码中修复,如果它已从 AOSP 版本修改。没有日志就不可能知道到底出了什么问题,但编解码器关闭中的死锁是一种可能。