Redmi Note 11 Pro 5G调用MediaCodec.createPersistentInputSurface()报错
相机预览黑屏问题(Redmi Note 11 Pro 5G专属)
问题概述
仅在Redmi Note 11 Pro 5G机型上出现该问题,其Camera支持等级为LEVEL_3,表现为相机预览黑屏,捕获会话创建失败。
错误信息
Stream configuration failed due to: endConfigure:667: Camera 0: Unsupported set of inputs/outputs provided 2025-02-03 12:14:49.525 6817-7967 CameraCaptureSession E Session 0: Failed to create capture session; configuration failed
堆栈日志
025-02-03 12:14:49.000 6817-7688 libc W Access denied finding property "vendor.camera.aux.packagelist" 2025-02-03 12:14:49.000 6817-7688 libc W Access denied finding property "vendor.camera.aux.packagelistext" 2025-02-03 12:14:49.003 6817-7688 libc W Access denied finding property "persist.vendor.camera.privapp.list" 2025-02-03 12:14:49.004 6817-7688 CameraExtImplXiaoMi D initCameraDevice: 0 2025-02-03 12:14:49.020 6817-7688 CameraManager I Open camera top activityName is <activity name> 2025-02-03 12:14:49.040 6817-7402 CameraManagerGlobal E Camera 4 is not available. Ignore physical camera status change 2025-02-03 12:14:49.172 6817-7402 CameraInjector D updateCloudCameraControllerInfoAsync: has aleardy start update task. 2025-02-03 12:14:49.172 6817-7402 CameraInjector D waitForResult: 2025-02-03 12:14:49.172 6817-7402 libc W Access denied finding property "vendor.camera.aux.packagelist" 2025-02-03 12:14:49.173 6817-7402 libc W Access denied finding property "vendor.camera.aux.packagelistext" 2025-02-03 12:14:49.173 6817-7402 CameraManagerGlobal W ignore the torch status update of camera: 2 2025-02-03 12:14:49.173 6817-7402 CameraInjector D updateCloudCameraControllerInfoAsync: has aleardy start update task. 2025-02-03 12:14:49.173 6817-7402 CameraInjector D waitForResult: 2025-02-03 12:14:49.173 6817-7402 libc W Access denied finding property "vendor.camera.aux.packagelist" 2025-02-03 12:14:49.173 6817-7402 libc W Access denied finding property "vendor.camera.aux.packagelistext" 2025-02-03 12:14:49.174 6817-7402 CameraManagerGlobal W ignore the torch status update of camera: 3 2025-02-03 12:14:49.174 6817-7402 CameraInjector D updateCloudCameraControllerInfoAsync: has aleardy start update task. 2025-02-03 12:14:49.174 6817-7402 CameraInjector D waitForResult: 2025-02-03 12:14:49.174 6817-7402 libc W Access denied finding property "vendor.camera.aux.packagelist" 2025-02-03 12:14:49.174 6817-7402 libc W Access denied finding property "vendor.camera.aux.packagelistext" 2025-02-03 12:14:49.174 6817-7402 CameraManagerGlobal W ignore the torch status update of camera: 4 2025-02-03 12:14:49.175 6817-6835 CameraInjector D updateCloudCameraControllerInfoAsync: has aleardy start update task. 2025-02-03 12:14:49.175 6817-6835 CameraInjector D waitForResult: 2025-02-03 12:14:49.175 6817-6835 libc W Access denied finding property "vendor.camera.aux.packagelist" 2025-02-03 12:14:49.175 6817-6835 libc W Access denied finding property "vendor.camera.aux.packagelistext" 2025-02-03 12:14:49.176 6817-6835 CameraManagerGlobal W ignore the torch status update of camera: 5 2025-02-03 12:14:49.314 6817-7688 BpBinder W PerfMonitor binderTransact : time=294ms interface=android.hardware.ICameraService code=4 2025-02-03 12:14:49.320 6817-7967 Camera2Controller D FPS range is [12, 30] 2025-02-03 12:14:49.409 6817-7967 CameraDevice-JV-0 D waitUntilIdle: E. id = 0 2025-02-03 12:14:49.410 6817-7967 CameraDevice-JV-0 D waitUntilIdle: X 2025-02-03 12:14:49.525 6817-7967 CameraDevice-JV-0 W Stream configuration failed due to: endConfigure:667: Camera 0: Unsupported set of inputs/outputs provided 2025-02-03 12:14:49.525 6817-7967 CameraCaptureSession E Session 0: Failed to create capture session; configuration failed 2025-02-03 12:14:49.526 6817-7967 Camera2Con...iewSession D Configuration Failed
相关代码
private var recorderSurface: Surface? = null private var previewReader: ImageReader? = null private var captureReader: ImageReader? = null private var cameraThread: HandlerThread? = null private var cameraHandler: Handler? = null private var mediaRecorder: MediaRecorder? = null previewReader = ImageReader.newInstance(1920, 1080, ImageFormat.YUV_420_888, 5) captureReader = ImageReader.newInstance(1920, 1080, ImageFormat.YUV_420_888, 5) cameraThread = HandlerThread("Camera").also { it.start() } cameraHandler = Handler(cameraThread.looper) private fun createRecordRequest() { val recorderSurface = MediaCodec.createPersistentInputSurface() mediaRecorder = MediaRecorder().apply { setVideoSource(MediaRecorder.VideoSource.SURFACE) setOutputFormat(MediaRecorder.OutputFormat.MPEG_4) setOutputFile(context.cacheDir.path + "/file.mp4") setVideoEncoder(MediaRecorder.VideoEncoder.HEVC) setVideoEncodingBitRate(2_000_000) setVideoFrameRate(30) setVideoSize(1920, 1080) setInputSurface(recorderSurface) prepare() release() } this.recorderSurface = recorderSurface } private val stateCallback = object : CameraDevice.StateCallback() { override fun onOpened(cameraDevice: CameraDevice) { this@CameraController.cameraDevice = cameraDevice createRecordRequest() createCameraPreviewSession() } } private fun openCamera() { //检查权限 //传入相机ID val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager cameraManager.openCamera(cameraId, stateCallback, backgroundHandler) } private fun createCameraPreviewSession() { val surfaceList = mutableListOf<Surface>() previewReader?.surface?.let { surface -> surfaceList.add(surface) } captureReader?.surface?.let { surface -> surfaceList.add(surface) } //如果移除该行,报错就会消失,说明录制表面存在问题 recorderSurface?.let { surface -> surfaceList.add(surface) } val previewRequestBuilder = cameraDevice!!.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW) previewRequestBuilder.apply { addTarget(previewReader!!.surface) set( CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON ) } cameraDevice?.createCaptureSession( surfaceList, object : CameraCaptureSession.StateCallback() { override fun onConfigured(captureSession: CameraCaptureSession) { //后续执行配置步骤,但已失败 } override fun onConfigureFailed(cameraCaptureSession: CameraCaptureSession) { //配置失败 Timber.d("Configuration Failed") } }, cameraHandler) }
问题核心
创建捕获会话时添加recorderSurface会触发"Unsupported set of inputs/outputs provided"错误,移除该Surface则会话可正常创建,但无法进行视频录制,此问题仅存在于Redmi Note 11 Pro 5G机型。
解决方案建议
修复MediaRecorder资源释放时机
当前代码中createRecordRequest内调用prepare()后立刻执行release(),会导致recorderSurface关联的MediaRecorder资源被提前释放,Surface处于无效状态。应将release()移至录制完成后的销毁逻辑中。调整Surface组合与编码格式
- 尝试将视频编码格式从HEVC(
MediaRecorder.VideoEncoder.HEVC)改为H.264(MediaRecorder.VideoEncoder.H264),部分机型对HEVC的多Surface组合支持有限。 - 检查相机支持的Stream组合:通过
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP获取相机允许的输入输出组合,确认同时添加两个YUV ImageReader和录制Surface是否在支持列表中。若不支持,可暂时移除captureReader验证是否能正常创建会话,再考虑后续优化。
- 尝试将视频编码格式从HEVC(
动态添加录制Surface
不在创建CaptureSession时添加recorderSurface,而是在需要开始录制时,通过captureSession.addOutputTarget(recorderSurface)动态添加;录制结束后调用captureSession.removeOutputTarget(recorderSurface)移除,避免启动时的组合不兼容问题。
内容的提问来源于stack exchange,提问作者Zysora
相关产品推荐
相关产品推荐

