CameraX VideoCapture用例如何访问底层AudioRecord实现音频可视化
CameraX VideoCapture 音频电平采集实现说明
CameraX 的VideoCapture用例未公开获取底层AudioRecord实例的访问接口,官方将音视频采集的底层实现做了封装,直接通过反射等方式强取内部AudioRecord对象存在严重的版本兼容问题,不同CameraX版本的内部类结构、字段命名随时可能调整,线上极易触发崩溃,不建议用这种方式实现。
你可以根据项目依赖的CameraX版本选以下两种稳定方案实现音频电平展示:
- 方案1:使用官方内置的音频统计回调(推荐)
如果你使用的CameraX核心库版本≥1.2.0,Recorder(VideoCapture配套的录制实现类)已经提供了现成的音频振幅回调,不需要额外创建音频采集实例,也不存在权限冲突问题:
构建Recorder实例时注册AudioStatsListener,回调会周期性返回当前采集到的音频峰值振幅,直接拿这个值更新电平UI即可,示例代码如下:// 配置录制器时注册音频统计监听 val recorder = Recorder.Builder() .setQualitySelector(QualitySelector.from(Quality.FHD)) .setAudioStatsListener { stats -> // maxAmplitude值域为0~32767,可按UI需求做归一化处理 updateAudioLevelIndicator(stats.maxAmplitude) } .build() // 绑定VideoCapture用例到生命周期 val videoCapture = VideoCapture.withOutput(recorder) - 方案2:独立创建AudioRecord做电平计算(兼容低版本CameraX)
如果项目依赖的CameraX版本低于1.2.0,无法使用内置音频回调,可以单独初始化一个参数和VideoCapture对齐的AudioRecord实例:
配置和VideoCapture一致的采样率、声道数、音频编码格式,在视频录制启动时同步开启该AudioRecord的读流,仅读取采样数据计算实时振幅,不做音频存储。Android 10及以上系统原生支持多客户端并发采集MIC数据,低版本系统可将独立AudioRecord的音频源设置为MediaRecorder.AudioSource.VOICE_RECOGNITION降低焦点冲突概率,注意不要让独立实例长时间占用音频通道导致VideoCapture录制无声。
避坑提示:不要尝试修改CameraX内部类的访问权限拿底层AudioRecord,除了版本兼容问题外,部分厂商定制ROM会对CameraX内部的音频采集链路做修改,强拿的实例大概率无法读到正确的音频数据。
内容的提问来源于stack exchange,提问作者cubesoft
相关产品推荐
相关产品推荐

