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

Posted

技术标签:

【中文标题】使用 MediaRecorder.AudioSource.VOICE_COMMUNICATION 录制的音频在某些搭载 Android 10 的设备上为空【英文标题】:Recorded Audio using MediaRecorder.AudioSource.VOICE_COMMUNICATION is empty on some devices with Android 10 【发布时间】:2020-06-05 20:28:16 【问题描述】:

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

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 和小米 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()

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

由于并非所有 Android 设备都存在此问题,因此我不想转而使用 MediaRecorder.AudioSource.MIC)。同时,没有任何错误、异常或差异因素告诉我何时使用 MediaRecorder.AudioSource.MIC)

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

感谢您对此提供任何帮助。

【问题讨论】:

***.com/questions/58230181/… 您链接的帖子谈到了 MediaRecorder.AudioSource.VOICE_CALL。我使用的是 MediaRecorder.AudioSource。 VOICE_COMMUNICATION。我相信这其中有一些不同。另外,我没有记录电话。我正在消息应用程序中录制通常的音频消息。此外,它并非在所有 Android 10 设备上都失败,而只是在我之前提到的少数设备上失败。 【参考方案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的实施问题

【讨论】:

我在诺基亚 6.1 上遇到了完全相同的问题,并且确实关闭了 Google 助理会有所帮助。但是如果我真的想使用 VOICE_COMMUNICATION 音频源呢?我不能要求我们的客户禁用他们的助手,我希望能够使用音频预处理功能,例如回声消除。也许我可以手动设置不同的音频效果,但如果您有任何其他建议,将不胜感激) 我知道你来自哪里。这里的问题似乎是原始设备制造商的错误实施,他们将来可能会或可能不会修复,所以依赖它没有意义。您可以进行一些自定义修复,例如在几秒钟后观察录制的音频。如果它为空白且操作系统版本高于 10,则让用户可以选择关闭助手或使用 VOICE_RECOGNITION 切换到稍低的质量。

以上是关于使用 MediaRecorder.AudioSource.VOICE_COMMUNICATION 录制的音频在某些搭载 Android 10 的设备上为空的主要内容,如果未能解决你的问题,请参考以下文章

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份