Android 16的麦克风问题
问题
我正在使用 react-native-audio-recorder-player 来处理React Native语音SDK中的麦克风开启/关闭。
在Android 16上,首次麦克风会话能够正常工作,但如果我快速多次启动/停止录音器,麦克风会话最终在经过2–3次循环后无法初始化。
示例:
await audioRecorderPlayer.startRecorder()
await audioRecorderPlayer.stopRecorder()
await audioRecorderPlayer.startRecorder()
await audioRecorderPlayer.stopRecorder()
await audioRecorderPlayer.startRecorder() // eventually fails
重要细节
这不是权限问题。
- RECORD_AUDIO权限已授予
- 第一次初始化总是成功
- 失败仅在快速反复开启/关闭循环后发生
观察到的行为
- 仅在Android 16上可重现
- 在重新打开前等待几秒通常能解决
- 看起来本地音频资源在下一次初始化前没有被完全释放
- 有时
startRecorder()会挂起,或在多次循环后未能正确初始化
问题
- Android 16是否改变了AudioRecord的释放/重新初始化时序?
react-native-audio-recorder-player是否已知对快速重启录音器存在问题?- 在
stopRecorder()和startRecorder()之间是否有推荐的延迟/去抖动? - 是否应将录音器的start/stop调用串行化以避免原生端的竞态条件?
当前流程
const start = async () => {
await audioRecorderPlayer.startRecorder()
}
const stop = async () => {
await audioRecorderPlayer.stopRecorder()
}
快速连续调用 startRecorder() 和 stopRecorder() 最终会在Android 16上导致麦克风初始化失败。
是否有开发者在新版Android上遇到过与 react-native-audio-recorder-player 或AudioRecord相关的类似问题?
解决方案
嗯...
react-native-audio-recorder-player 似乎已经正式弃用并归档,因此不会有修复。维护者已转向 react-native-nitro-sound See here 作为替代。你可能会在这里找到需要修复的部分。
如果你现在不能迁移,在stopRecorder() 之后再调用startRecorder() 之前增加大约 ~300ms的延迟,可能有助于解决Android 16上的释放阶段竞态条件——但这只是一个权宜之计,并非真正的修复。
这可能作为一个变通方案。
const stop = async () => {
await audioRecorderPlayer.stopRecorder();
await new Promise(res => setTimeout(res, 300));
};
迁移可能是这里更干净、也更合适的方案。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。