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

Flutter WebRTC跨端通话异常:真实iOS与Android触发Stream空PlatformException

真实iOS设备与安卓设备WebRTC通话报错mediaStream AddTrack: Stream is null解决方案

问题背景

基于Flutter WebRTC开发通话功能,安卓设备间、安卓与iOS模拟器间、iOS模拟器与真实iOS设备间通话均正常,但真实iOS设备与安卓设备互通时,出现错误:PlatformException(mediaStream AddTrack: Stream is null, null, null, null)。

针对性解决方案

  • 强制校验iOS媒体权限有效性
    真实iOS设备对媒体权限的校验比模拟器严格,务必确保Info.plist中添加了NSCameraUsageDescription和NSMicrophoneUsageDescription字段并填写合理描述。同时在代码中使用权限库(如permission_handler)主动检查权限状态,只有在权限被用户授予后,再执行媒体流初始化操作。

  • 确保媒体流初始化完成后再执行Track添加
    报错核心原因是执行addTrack时媒体流对象为空,检查代码中getUserMedia的调用逻辑,必须在Future完成(通过await或then回调)后,确认MediaStream实例不为null,再执行Track添加操作。示例代码:

    final mediaStream = await navigator.mediaDevices.getUserMedia({
      'audio': true,
      'video': true,
    });
    if (mediaStream != null && mediaStream.getAudioTracks().isNotEmpty) {
      peerConnection.addTrack(mediaStream.getAudioTracks()[0], mediaStream);
    }
    if (mediaStream != null && mediaStream.getVideoTracks().isNotEmpty) {
      peerConnection.addTrack(mediaStream.getVideoTracks()[0], mediaStream);
    }
    
  • 适配iOS音频会话配置
    iOS的AVAudioSession对媒体资源占用有严格管控,在初始化WebRTC前主动配置音频会话类别:

    if (Platform.isIOS) {
      await FlutterWebRTC.setAudioSessionCategory(AudioSessionCategory.playAndRecord);
      await FlutterWebRTC.setAudioSessionActive(true);
    }
    
  • 升级WebRTC插件至稳定版
    部分旧版flutter_webrtc插件存在跨平台Track交互的兼容性bug,执行flutter pub upgrade flutter_webrtc更新至最新稳定版本,同时执行cd ios && pod install同步iOS端依赖。

  • 排查SDP交换完整性
    检查真实iOS与安卓设备间的SDP Offer/Answer交换日志,确认SDP内容中包含正确的媒体流描述。如果SDP缺失媒体信息,会导致后续Track添加时无法关联到有效流对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:34:55