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

问题描述

Android版本:5.1

嗨,我注意到之后,我的应用使用 camera2 API创建CaptureSession (快照/记录),我的android设备不再正确播放视频,只有黑屏的音频 ...而不仅仅是我的应用,其他所有流式应用都出现相同的问题。我需要重新启动才能解决此问题。顺便说一句,我的设备是自定义的,所以我不能使用ADB,并且模拟器中甚至都不会发生此问题。有人可以帮我吗?我会很感激.. !!以下是我createCaptureSession和发布的方式。也许我的代码有问题吗?

快照:

...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()!!,cameraHandler)

打开电击时:

        cameraPreview?.surfaceTextureListener = null

        cameraCaptureSession?.stopRepeating()

        cameraCaptureSession?.close()

        cameraDevice?.close()

        cameraDevice = null

解决方法

没有设备的日志很难说,但是很可能设备的媒体编解码器堆栈出了问题。在使用MediaRecorder完成您的应用程序后,这会使编解码器处于不良状态,需要重新启动才能再次进行编码或解码。

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

不幸的是,如果这是问题所在,则很有可能需要将其固定在设备的编解码器HAL中,或者很可能是在stagefright媒体代码中进行修复(如果已从AOSP版本进行了修改)。确切地说,没有日志是不可能知道什么问题的,但是编解码器关闭中的死锁是一种可能。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...