使用 MediaRecorder.AudioSource.VOICE_COMMUNICATION 录制的音频在某些 Android 10 设备上为空

bin*_*mic 10 android android-mediarecorder android-10.0

我正在使用以下代码在应用程序中录制语音消息的音频。

MediaRecorder audioRecorder = new MediaRecorder();
audioRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION);
audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC);
audioRecorder.setOutputFile(audioRecordingFile);
audioRecorder.prepare();
audioRecorder.start();
Run Code Online (Sandbox Code Playgroud)

使用MediaRecorder.AudioSource.VOICE_COMMUNICATION而不是MediaRecorder.AudioSource.MIC)对于录制预处理干净的音频非常有帮助。

但是,最近我发现在一些最近更新到 Android 10 的设备上报告了一些记录文件为空的问题。 应该注意的是,并非所有的 Android 10 设备都有这些问题,只有少数,即诺基亚 6.1 和米A2。

没有错误或异常,只是空的音频输出文件。

如果我使用MediaRecorder.AudioSource.MIC),则不会出现此问题。

我发现以下与 Android 10 和 VOICE_COMMUNICATION 相关的信息 Android 10 版本包括以下使用 VOICE_COMMUNICATION 捕获的要求。

基于此,我使用以下代码检查了 AcousticEchoCanceler、AutomaticGainControl 和 NoiseSuppressor 的可用性。

AcousticEchoCanceler.isAvailable()
AutomaticGainControl.isAvailable()
NoiseSuppressor.isAvailable()
Run Code Online (Sandbox Code Playgroud)

并在搭载 Android 10 的 Mi A2 和 OnePlus 6 上发现了相同的结果。这两款设备都显示 AcousticEchoCanceler 和 NoiseSuppressor 可用,而 AutomaticGainControl 不可用。

由于并非所有 Android 设备都存在此问题,因此我不想依赖于使用MediaRecorder.AudioSource.MIC)。同时,没有错误、异常或区分因素告诉我何时回退到 MediaRecorder.AudioSource.MIC)

更新: 在 Mi A2 上关闭 Google Assistant 时,问题得到解决。这可能是指针:https : //developer.android.com/guide/topics/media/sharing-audio-input

对此的任何帮助表示赞赏。

bin*_*mic 1

我最终在所有 Android 版本上使用MediaRecorder.AudioSource.VOICE_RECOGNITION而不是MediaRecorder.AudioSource.VOICE_COMMUNICATION 。

我们最终在 15 种以上不同的设备上进行了采样,发现MediaRecorder.AudioSource.VOICE_RECOGNITION最适合大多数设备,包括高端和中端手机。

据我了解,某些设备上的少数设备面临的原始问题似乎是 OEM 针对 Android 10 和 VOICE_COMMUNICATION https://source.android.com/devices/audio/implement-pre-processing的实现问题