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 版本修改。没有日志就不可能知道到底出了什么问题,但编解码器关闭中的死锁是一种可能。
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 版本修改。没有日志就不可能知道到底出了什么问题,但编解码器关闭中的死锁是一种可能。