如何在Flutter应用中实现通话时将音乐输入麦克风共享给对方?
Flutter实现通话时将音乐共享给对方的方案
要实现把本地播放的音乐作为麦克风输入,让WhatsApp等通话应用的对方听到,核心是音频路由与会话配置——Flutter本身没有直接操作系统音频底层的API,需要结合原生能力和合适的插件来实现,以下是具体方案:
核心原理
让系统将音乐播放的音频流重定向到通话应用的输入通道,需要配置音频会话为「播放+录制」模式,同时获取必要的系统权限,部分场景下还需要原生层的音频捕获/注入逻辑。
步骤实现
1. 依赖插件
使用以下Flutter插件简化音频会话配置和音乐播放:
audio_session:跨平台音频会话配置工具just_audio:稳定的本地/在线音乐播放库
在pubspec.yaml中添加依赖:
dependencies: audio_session: ^0.1.16 just_audio: ^0.9.34
2. 配置音频会话
应用启动时配置音频会话,让系统允许同时播放和录制,并适配通话场景:
import 'package:audio_session/audio_session.dart'; Future<void> initAudioSession() async { final session = await AudioSession.instance; // 配置音频会话为通话模式,允许播放+录制 await session.configure(AudioSessionConfiguration( // iOS端配置 avAudioSessionCategory: AVAudioSessionCategory.playAndRecord, avAudioSessionCategoryOptions: AVAudioSessionCategoryOptions.mixWithOthers | AVAudioSessionCategoryOptions.defaultToSpeaker, avAudioSessionMode: AVAudioSessionMode.voiceChat, // Android端配置 androidAudioAttributes: AndroidAudioAttributes( contentType: AndroidAudioContentType.music, usage: AndroidAudioUsage.voiceCommunication, ), androidAudioFocusGainType: AndroidAudioFocusGainType.gain, )); }
3. 播放音乐
使用just_audio播放音乐,确保播放流纳入配置好的音频会话:
import 'package:just_audio/just_audio.dart'; final AudioPlayer _audioPlayer = AudioPlayer(); Future<void> playMusic(String musicPath) async { try { await _audioPlayer.setFilePath(musicPath); // 本地文件路径,或用setUrl播放在线链接 await _audioPlayer.play(); } catch (e) { print('播放失败: $e'); } }
4. 平台特定补充处理
Android平台
- 权限申请:在
AndroidManifest.xml中添加必要权限:<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <!-- Android 11+ 捕获系统音频需额外权限 --> <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" /> - 处理音频焦点冲突:通过
audio_session监听焦点变化,避免通话应用抢占焦点后音乐中断。
iOS平台
- 权限申请:在
Info.plist中添加权限描述:<key>NSMicrophoneUsageDescription</key> <string>需要使用麦克风来共享音乐</string> <key>NSMusicLibraryUsageDescription</key> <string>需要访问音乐库来播放本地音乐</string> - iOS系统对音频捕获限制较严格,部分机型需借助原生
AVAudioEngine将音乐流直接路由到录制通道,或开启系统自带的「音频共享」功能辅助实现。
关键注意事项
- 通话应用(如WhatsApp)可能强制抢占音频会话,需测试不同应用的兼容性
- 部分安卓设备因硬件限制无法实现音频流重定向,需针对性适配
- 必须动态申请权限,仅静态权限声明无法在运行时获取权限
内容的提问来源于stack exchange,提问作者Asheer Butt
相关产品推荐
相关产品推荐

