Flutter使用camera插件录视频时如何选择音频源及单独控制音频输入输出
音频设备控制相关实现方案
核心问题答复
- Flutter本身没有内置音频设备管理API,但可通过成熟的第三方插件实现切换音频源、单独控制输入输出设备的需求
- 若插件无法满足定制化需求,Android/iOS原生均有成熟的实现方案
Flutter端实现方案
- 所需插件:优先用
audio_session+flutter_sound组合,两个插件均全平台适配无额外原生开发成本- 固定音频输出到耳机:初始化音频会话时调用
audio_session的configure方法,iOS侧设置AVAudioSessionCategory为playAndRecord,输出路由优先级锁定为耳机;Android侧设置AudioAttributes的usage为媒体播放,强制输出到已连接耳机,只要耳机处于连接状态就不会切到扬声器 - 切换麦克风:用
flutter_sound的enumerateAudioInputs方法可以拿到所有可用的麦克风设备列表(包含内置麦、耳机麦、蓝牙麦等),给用户做选择后,调用setInputDevice方法指定录制使用的麦克风即可
- 固定音频输出到耳机:初始化音频会话时调用
- 注意:Android 12及以上系统需要申请
RECORD_AUDIO、MODIFY_AUDIO_SETTINGS权限,iOS需要申请NSMicrophoneUsageDescription权限
原生端定制实现方案
如果第三方插件的能力无法匹配你的特殊场景需求,可以按如下原生逻辑实现,再通过Flutter Platform Channel和Flutter侧通信即可。
Android端(Kotlin)
- 设备枚举:通过系统
AudioManager服务的getDevices方法,分别传入GET_DEVICES_INPUTS、GET_DEVICES_OUTPUTS参数获取所有输入输出设备列表 - 切换麦克风:创建
MediaRecorder/AudioRecord实例时,调用setPreferredDevice方法传入选中的麦克风设备即可 - 锁定输出到耳机:配置音频播放的
AudioAttributes为USAGE_MEDIA,同时调用AudioManager.setPreferredDevice强制输出路由指向已连接的耳机设备,可注册ACTION_HEADSET_PLUG广播监听耳机插拔状态动态调整策略
iOS端(Swift)
- 设备枚举:通过
AVAudioSession.sharedInstance().availableInputs获取所有可用麦克风输入设备,currentRoute.outputs获取当前可用输出设备 - 切换麦克风:调用
AVAudioSession.sharedInstance().setPreferredInput(_:)方法传入选中的麦克风设备即可 - 锁定输出到耳机:配置
AVAudioSession的category为.playAndRecord,选项添加.allowBluetooth、.allowBluetoothA2DP,同时调用setPreferredOutputAudioPort(.headphones)强制输出到耳机,监听AVAudioSession.routeChangeNotification通知处理耳机插拔事件
内容的提问来源于stack exchange,提问作者Micha
相关产品推荐
相关产品推荐

