You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Flutter开发支持多麦克风同时录音的录音应用

Flutter实现多外接麦克风同步多路采集方案

Flutter生态目前没有开箱即用的插件支持该能力,多输入设备并发采集属于系统级音频能力,必须通过平台通道编写原生逻辑实现,纯Dart层无法直接访问系统音频路由接口,具体实现路径如下:

前置版本与权限要求

  • Android端:最低支持Android 6.0(API 23),需在Manifest中声明RECORD_AUDIO、MODIFY_AUDIO_SETTINGS权限
  • iOS端:最低支持iOS 14,需在Info.plist中添加NSMicrophoneUsageDescription权限声明
  • 硬件要求:外接麦克风需被系统识别为独立音频输入设备,若系统将多个外接设备合并为单输入通道(比如部分USB集线器挂载的麦),无法拆分独立采集

分平台原生实现逻辑

Android端

  • 设备枚举:调用AudioManager.getDevices(AudioDevice.GET_DEVICES_INPUTS),筛选出所有外接输入设备(USB麦、蓝牙麦、外接声卡麦等),记录每个设备的唯一ID与设备信息
  • 采集实例创建:为每个需要采集的麦克风单独初始化AudioRecord实例,通过AudioRecord.Builder.setPreferredDevice()方法将实例与对应麦克风绑定,所有实例必须配置完全一致的采样率、位深、单声道参数,为后续同步对齐做准备
  • 同步采集:启动采集前给所有采集线程加同步锁,记录统一的启动基准时间戳;所有AudioRecord实例同时触发startRecording,每个采集到的PCM数据块都绑定对应设备ID、相对基准时间的时间戳
  • 注意不要使用MediaRecorder实现,该组件不支持绑定指定输入设备,仅能采集默认输入源的音频。

iOS端

  • 会话配置:初始化AVAudioSession,将category设置为AVAudioSessionCategoryPlayAndRecord,options添加AVAudioSessionCategoryOptionAllowBluetoothA2DP、AVAudioSessionCategoryOptionMixWithOthers,激活音频会话
  • 设备枚举:通过AVAudioSession.sharedInstance.availableInputs获取所有可用输入端口,筛选出外接麦克风对应的AVAudioSessionPortDescription实例
  • 采集实例创建:初始化AVAudioEngine,为每个目标麦克风创建独立的AVAudioInputNode,将节点与对应输入端口绑定,所有节点配置和Android端完全一致的音频格式参数
  • 同步采集:和Android端逻辑一致,记录统一启动基准时间戳,启动engine后为每个inputNode添加音频tap回调,每个回调返回的PCM块绑定设备ID与相对时间戳。

Flutter层对接逻辑

  • 信令通道:通过MethodChannel实现控制指令传输,支持Flutter层触发设备枚举、启动采集、停止采集操作,原生端通过该通道回传设备列表、采集状态、错误信息
  • 数据通道:通过EventChannel将原生端采集到的带时间戳、设备标识的PCM数据块实时推送到Flutter层
  • 同步校准:Flutter层收到首帧数据时计算各设备的时间偏移量,后续存储、处理、播放时按偏移量对齐,可将多路音频的时间误差控制在10ms以内;如果需要落盘,可以直接按时间戳对齐后分别编码为独立音频文件,也可以按需求做混音处理。

常见坑点

  • 不要尝试基于现有开源录音插件(如record、flutter_sound)二次开发,这类插件内部默认绑定系统主输入源,没有暴露多实例、指定设备绑定的接口,改造的工作量远大于从零实现平台通道逻辑
  • 部分深度定制的安卓ROM会裁剪多音频输入并发的系统能力,采集前需要先做能力检测,不支持的设备提前给用户提示
  • 多麦并发采集功耗较高,采集停止后必须及时释放所有原生端的音频实例,避免出现内存泄漏、设备占用的问题

内容的提问来源于stack exchange,提问作者umar_baloch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:09:17