iOS真机同时使用flutter_audio_capture与audioplayers时麦克风捕获失败
解决iOS真机上flutter_audio_capture与audioplayers插件共存时麦克风失效的问题
问题根源
报错-10851对应iOS音频框架的kAudioUnitErr_InvalidPropertyValue,本质是两个插件的音频会话配置冲突:
- flutter_audio_capture默认使用录音类音频会话,audioplayers默认使用播放类会话
- iOS真机对音频会话的权限和模式管理远严于模拟器,冲突会直接导致音频单元初始化失败,麦克风捕获失效
解决方案
1. 统一音频会话配置
使用audio_session插件手动配置全局音频会话为playAndRecord模式,确保两个插件共用同一会话规则:
import 'package:audio_session/audio_session.dart'; Future<void> setupAudioSession() async { final session = await AudioSession.instance; await session.configure(const AudioSessionConfiguration( avAudioSessionCategory: AVAudioSessionCategory.playAndRecord, avAudioSessionCategoryOptions: AVAudioSessionCategoryOptions.defaultToSpeaker, // 可选:强制用扬声器播放 avAudioSessionMode: AVAudioSessionMode.spokenAudio, )); }
在启动麦克风捕获或音频播放之前调用此方法,比如在页面初始化时执行:
@override void initState() { super.initState(); setupAudioSession(); }
2. 调整插件使用顺序
避免同时初始化两个插件的音频功能:
- 先启动麦克风捕获(此时会话已切换为录音兼容模式),再启动音频播放
- 或者在播放音频前,确保会话已切换为
playAndRecord模式,而非纯播放模式
3. 完善Info.plist权限配置
确保Info.plist中同时添加麦克风和音频权限声明,缺一不可:
<key>NSMicrophoneUsageDescription</key> <string>需要使用麦克风进行音频捕获</string> <key>NSAudioUsageDescription</key> <string>需要使用音频播放功能</string>
4. 更新插件版本
检查并升级flutter_audio_capture和audioplayers到最新稳定版:
- 旧版本插件可能存在音频会话管理的兼容性bug,新版本通常会修复跨插件会话冲突问题
5. 手动管理会话激活状态
如果仍有冲突,可在切换音频功能时手动激活/停用会话:
// 启动捕获前激活会话 await AudioSession.instance.setActive(true); // 停止捕获或播放后停用会话 await AudioSession.instance.setActive(false);
内容的提问来源于stack exchange,提问作者Oleg Oleg
相关产品推荐
相关产品推荐

