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

Flutter WebRTC iOS端音频异常:扬声器无声音及enableSpeakerphone报错

iOS 端 flutter_webrtc 音频问题解决方案

针对你使用 flutter_webrtc: ^0.9.24 开发视频通话时遇到的 iOS 音频问题(部分设备无声音、仅听筒出声、调用 enableSpeakerphone(true) 触发 UnimplementedError),以下是具体解决方法:

1. 解决 UnimplementedError 问题

flutter_webrtc: ^0.9.24 的 iOS 端并未实现 enableSpeakerphone 方法,直接调用必然报错,需通过原生音频会话配置替代。

2. 配置 iOS 音频会话与权限

步骤1:添加 Info.plist 权限

在 iOS 项目的 Info.plist 中添加麦克风和摄像头权限声明:

<key>NSMicrophoneUsageDescription</key>
<string>视频通话需要访问麦克风</string>
<key>NSCameraUsageDescription</key>
<string>视频通话需要访问摄像头</string>

步骤2:通过音频会话切换扬声器

推荐使用 audio_session 插件快速配置,无需手动写原生代码:

  • 先添加依赖:
    dependencies:
      audio_session: ^0.1.14
    
  • 实现扬声器切换方法:
    import 'package:audio_session/audio_session.dart';
    
    Future<void> toggleSpeaker(bool enable) async {
      final session = await AudioSession.instance;
      await session.configure(AudioSessionConfiguration(
        avAudioSessionCategory: AVAudioSessionCategory.playAndRecord,
        avAudioSessionCategoryOptions: enable 
            ? AVAudioSessionCategoryOptions.defaultToSpeaker 
            : AVAudioSessionCategoryOptions.none,
        avAudioSessionMode: AVAudioSessionMode.voiceChat,
      ));
    }
    
    调用时直接传入 true 即可切换到扬声器,false 切回听筒。

如果不想额外引入插件,也可以通过 MethodChannel 调用原生代码:

iOS 原生 Swift 代码:

import AVFoundation

@objc class AudioHandler: NSObject {
    @objc func setSpeakerEnabled(_ enabled: Bool) {
        let session = AVAudioSession.sharedInstance()
        do {
            try session.setCategory(.playAndRecord, mode: .voiceChat, options: enabled ? .defaultToSpeaker : [])
            try session.setActive(true)
        } catch {
            print("音频会话配置失败: \(error)")
        }
    }
}

Dart 侧调用:

import 'package:flutter/services.dart';

final MethodChannel _audioChannel = MethodChannel('com.example.audio_handler');

Future<void> setSpeaker(bool enable) async {
    await _audioChannel.invokeMethod('setSpeakerEnabled', enable);
}

3. 解决部分 iOS 设备无声音问题

  • 确保在创建媒体流之前完成音频会话配置,避免会话冲突导致音频无法正常工作。
  • 若设备处于静音模式仍需扬声器出声,可在配置时添加 AVAudioSessionCategoryOptions.overrideMuteSwitch 选项。
  • 检查麦克风权限是否已授予,无权限会导致音频录制/播放失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:30:22