一、问题背景
目前麦克风是否可用的检测方案过于简单,容易出现检测不准确的情况。针对此问题做了如下优化。
推荐集成方在使用麦克风的采集和上行功能前要检测麦克风是否可用。
二、麦克风探测器功能介绍
1、录音。包括采样率、声源、采样位数、声道数等参数适配,保存音频文件生成pcm或者wav,获取音频的分贝值。
2、麦克风权限是否授予检测。
3、麦克风当前是否被占用检测。
4、音频数据的合法性检测。采集到的音频有没有被系统静默处理。
检测方案如下图所示:
三、录音机录音以及生成音频文件
系统录音机AudioRecord正常启动是麦克风占用检测的前提,系统录音机正常启动需要给录音机传入正确的参数,包括声源、采样率、声道数、采样位数,录音机才会创建成功。根据AudioRecord提供的API以及以往开发经验,绝大部分(具体数据没有统计)机型传入以下参数系统录音机能创建成功:
mAudioSource = MediaRecorder.AudioSource.MIC;
mSampleRateInHz = 16000;
mChannelConfig = AudioFormat.CHANNEL_IN_MONO;
mAudioFormat = AudioFormat.ENCODING_PCM_16BIT
极其个别机型录音参数需要适配,目前的适配:
//1、魅族、OPPO、realme的Android10系统,开启无障碍时的参数
if (context != null
&& (DeviceUtil.isMeiZu() || DeviceUtil.isOppo() || DeviceUtil.isRealMe())
&& (DeviceUtil.getSdkIntVersion() == 29)
&& DeviceUtil.isAccessibilityEnabled(context.getApplicationContext())) {
mAudioSource = MediaRecorder.AudioSource.VOICE_RECOGNITION;
mChannelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
}
读麦克风返回的数据会先缓存在内存中,最后一次读取的数据(index为负数)返回后,可保存生成pcm或者wav方便测试。麦克风录音流程图如下所示: