使用Camerax1.0.2录视频停止,报MediaCodec.reset()空指针如何解决?
问题原因
- 这是Camerax 1.0.2版本的已知底层bug,
MediaCodec.reset()空指针的根本原因是音视频编解码器实例初始化失败返回null,后续调用生命周期方法时触发崩溃,常见触发场景如下:- 构建
VideoCapture实例时未显式配置音频参数,即使申请了RECORD_AUDIO权限,底层初始化音频采集链路时依旧会因为缺少配置导致MediaCodec初始化失败 - 1.0.2版本对
MediaCodec的生命周期管理存在缺陷,在Android 9及以下设备、或设备当前有其他进程占用音视频编解码器资源时,Camerax申请Codec失败会直接返回null,没有做异常兜底 - 调用
startRecording时,CameraX的预览、录制等UseCase还未完成和LifecycleOwner的绑定,底层录制链路还未初始化完成就触发录制逻辑 - 输出配置的分辨率、格式超出设备支持范围,导致
MediaCodec初始化失败
- 构建
修复方案
方案1:正确配置
VideoCapture实例,构建时显式开启音频采集配置// Camerax 1.0.2版本构建VideoCapture示例 val videoCapture = VideoCapture.Builder() .setTargetRotation(viewFinder.display.rotation) // 必须添加该行,显式指定音频源开启音频采集 .setAudioSource(MediaStore.Audio.Media.DEFAULT_SOUND) .build()如果你不需要录制音频,不要申请
RECORD_AUDIO权限,构建时也不要配置音频源,底层就不会初始化音频相关的MediaCodec,也能避免该问题。方案2:升级Camerax版本
该bug在1.1.0-alpha03及之后的版本已经被官方修复,可直接升级到更高的稳定版(如1.3.0稳定版),无需修改现有业务逻辑即可解决问题。方案3:无法升级版本时添加兜底逻辑
- 确保所有CameraX的UseCase绑定到LifecycleOwner完成后,延迟至少500ms再调用
startRecording方法 - 检查
getNewVideoOutputFileOptions方法返回的输出配置,确保分辨率、输出格式符合当前设备的支持范围 - 对
startRecording添加异常捕获,避免直接崩溃:
try { // 原有录制逻辑 videoCapture.startRecording(getNewVideoOutputFileOptions(requireContext().contentResolver), ContextCompat.getMainExecutor(requireContext()), object : VideoCapture.OnVideoSavedCallback { // 原有回调逻辑保持不变 } ) } catch (e: NullPointerException) { Toast.makeText(requireContext(), "录制初始化失败,请重试", Toast.LENGTH_SHORT).show() }- 确保所有CameraX的UseCase绑定到LifecycleOwner完成后,延迟至少500ms再调用
内容的提问来源于stack exchange,提问作者Richa
相关产品推荐
相关产品推荐

