You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Camerax1.0.2录视频停止,报MediaCodec.reset()空指针如何解决?

问题原因
  • 这是Camerax 1.0.2版本的已知底层bug,MediaCodec.reset()空指针的根本原因是音视频编解码器实例初始化失败返回null,后续调用生命周期方法时触发崩溃,常见触发场景如下:
    1. 构建VideoCapture实例时未显式配置音频参数,即使申请了RECORD_AUDIO权限,底层初始化音频采集链路时依旧会因为缺少配置导致MediaCodec初始化失败
    2. 1.0.2版本对MediaCodec的生命周期管理存在缺陷,在Android 9及以下设备、或设备当前有其他进程占用音视频编解码器资源时,Camerax申请Codec失败会直接返回null,没有做异常兜底
    3. 调用startRecording时,CameraX的预览、录制等UseCase还未完成和LifecycleOwner的绑定,底层录制链路还未初始化完成就触发录制逻辑
    4. 输出配置的分辨率、格式超出设备支持范围,导致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:无法升级版本时添加兜底逻辑

    1. 确保所有CameraX的UseCase绑定到LifecycleOwner完成后,延迟至少500ms再调用startRecording方法
    2. 检查getNewVideoOutputFileOptions方法返回的输出配置,确保分辨率、输出格式符合当前设备的支持范围
    3. 对startRecording添加异常捕获,避免直接崩溃:
    try {
        // 原有录制逻辑
        videoCapture.startRecording(getNewVideoOutputFileOptions(requireContext().contentResolver),
            ContextCompat.getMainExecutor(requireContext()),
            object : VideoCapture.OnVideoSavedCallback {
                // 原有回调逻辑保持不变
            }
        )
    } catch (e: NullPointerException) {
        Toast.makeText(requireContext(), "录制初始化失败,请重试", Toast.LENGTH_SHORT).show()
    }
    

内容的提问来源于stack exchange,提问作者Richa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:54:01