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

Recorded Audio using MediaRecorder.AudioSource.VOICE_COMMUNICATION is empty on some devices with Android 10

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

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();

使用MediaRecorder.AudioSource.VOICE_COMMUNICATION代替MediaRecorder.AudioSource.MIC)对录制经过预处理的干净音频非常有帮助.

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

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

如果我使用MediaRecorder.AudioSource.MIC)那么问题就不会出现。

我找到了以下与 Android 10 和 VOICE_COMMUNICATION 相关的信息 The Android 10 release includes the following requirements for capture with VOICE_COMMUNICATION.

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

AcousticEchoCanceler.isAvailable()
AutomaticGainControl.isAvailable()
NoiseSuppressor.isAvailable()

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

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

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

如有任何帮助,我们将不胜感激。

我最终在所有 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[=11 方面的实施问题=]