如何解决使用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版本进行了修改)。确切地说,没有日志是不可能知道什么问题的,但是编解码器关闭中的死锁是一种可能。