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

Flutter中如何将P2P通话的音频输出从扬声器切换为听筒

Flutter P2P通话切换听筒播放解决方案

你当前使用的是flutter_webrtc库实现音视频通话,默认音频输出走扬声器,可通过以下步骤切换为听筒输出:

前置配置

权限添加

  • Android端:在android/app/src/main/AndroidManifest.xml中添加音频修改权限
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    
  • iOS端:在ios/Runner/Info.plist中添加音频会话配置,确保语音通话模式正常生效
    <key>UIBackgroundModes</key>
    <array>
      <string>audio</string>
    </array>
    

代码修改

flutter_webrtc内置的Helper类提供了直接切换音频输出路由的方法,你只需要在媒体流初始化完成后调用关闭扬声器的方法,系统就会自动切换到听筒输出。

修改openUserMedia方法

在你现有的媒体流初始化逻辑末尾新增切换逻辑即可:

Future<void> openUserMedia(RTCVideoRenderer localVideo,
    RTCVideoRenderer remoteVideo, BuildContext contextt) async {
  context = contextt;
  chatProvider = Provider.of<ChatProvider>(context, listen: false);

  var stream = await navigator.mediaDevices.getUserMedia({'audio': true});

  localVideo.srcObject = stream;
  localStream = stream;

  remoteVideo.srcObject = await createLocalMediaStream('key');

  // 新增:关闭扬声器,切换为听筒输出
  await Helper.setSpeakerphoneOn(false);
}

可选:动态切换扬声器/听筒

如果需要支持用户手动切换音频输出,可以新增通用切换方法:

/// 切换音频输出路由
/// [useSpeaker] true=启用扬声器,false=启用听筒
Future<void> toggleAudioOutput(bool useSpeaker) async {
  await Helper.setSpeakerphoneOn(useSpeaker);
}

兼容方案(如上述方法不生效)

如果使用flutter_webrtc内置方法切换失效,可以引入audio_session库全局配置音频会话,强制输出到听筒:

  1. 先在pubspec.yaml中添加audio_session依赖
  2. 初始化媒体流前配置音频会话:
import 'package:audio_session/audio_session.dart';

// 放在getUserMedia调用前执行
final audioSession = await AudioSession.instance;
await audioSession.configure(const AudioSessionConfiguration(
  avAudioSessionCategory: AVAudioSessionCategory.playAndRecord,
  avAudioSessionMode: AVAudioSessionMode.voiceChat,
  androidAudioUsage: AndroidAudioUsage.voiceCommunication,
  androidAudioContentType: AndroidAudioContentType.speech,
));
// 强制指定输出到听筒
await audioSession.setPreferredOutputType(AudioOutputType.receiver);

注意事项

  • 所有音频路由切换操作必须在用户授予音频权限后执行,否则会失效
  • 通话结束后建议调用Helper.setSpeakerphoneOn(true)恢复默认音频输出,避免影响其他应用的音频功能
  • 当设备连接蓝牙耳机/有线耳机时,系统会自动优先输出到耳机,符合常规通话逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:09:03