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

PeerDart移动数据环境下连接断开及视频流异常问题求助

问题分析

从日志和现象来看,核心问题是移动数据网络下首次ICE连接建立失败,但第二次复用候选后成功,本质是WebRTC的NAT穿透(ICE)在移动数据环境下的适配问题:

  • WiFi环境下NAT类型较宽松,STUN服务器就能获取有效公网候选,连接一次成功
  • 移动数据网络NAT通常更严格(比如对称NAT),首次ICE候选收集不完整或延迟,导致PeerConnection因无有效通路断开;第二次连接时,设备缓存了之前收集的候选(或ICE服务器返回了更有效的候选),因此能建立连接
解决方案

1. 配置TURN服务器(关键)

默认的STUN服务器在对称NAT环境下(多数移动数据网络)无法穿透,必须添加TURN服务器作为中继:

Peer peer = Peer(
  config: {
    'iceServers': [
      // 公共STUN服务器(可保留)
      {'urls': 'stun:stun.l.google.com:19302'},
      // 替换为你自己部署的TURN服务器配置
      {
        'urls': 'turn:your-turn-server.com:3478',
        'username': 'your-username',
        'credential': 'your-password'
      }
    ]
  }
);

TURN服务器会在STUN无法穿透时作为数据中继,确保移动数据下的连接通路。

2. 优化ICE候选收集策略

修改PeerDart的连接逻辑,等待ICE候选收集完成后再发起呼叫,避免因候选不全导致首次失败:

List<Map<String, dynamic>> iceCandidates = [];
peer.onIceCandidate.listen((candidate) {
  if (candidate != null) {
    iceCandidates.add(candidate.toMap());
  } else {
    // 候选收集完成后发起呼叫
    callTargetPeer(iceCandidates);
  }
});

// 发起呼叫时携带已收集的候选
void callTargetPeer(List<Map<String, dynamic>> candidates) {
  var call = peer.call('target-peer-id', mediaStream);
  // 发送缓存的ICE候选
  candidates.forEach((candidate) {
    call.addCandidate(Candidate.fromMap(candidate));
  });
}

3. 补充Android网络相关配置

除已添加的权限,补充以下配置适配移动数据:

  • 添加前台服务权限,确保后台网络连接稳定:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" />
  • 在AndroidManifest.xml的<application>标签下允许Cleartext流量(如果你的Peer服务器是HTTP协议):
<application
  ...
  android:usesCleartextTraffic="true">

4. 增加连接重试机制

在PeerConnection断开时自动重试连接,利用第二次的候选缓存:

peer.onDisconnected.listen((peerId) {
  // 延迟1秒后重新发起呼叫
  Future.delayed(Duration(seconds: 1), () {
    reinitiateCall();
  });
});

5. 排查移动端ICE候选日志

在移动端添加ICE候选日志,对比首次和第二次连接的候选差异:

peer.onIceCandidate.listen((candidate) {
  print('Mobile ICE Candidate: ${candidate?.toMap()}');
});

如果首次没有拿到srflx(服务器反射)或relay(TURN中继)类型的候选,说明STUN/TURN配置存在问题。

首次失败、第二次成功的原因

移动数据网络下,设备首次向STUN/TURN服务器请求候选时,可能因网络延迟、NAT端口映射未及时生效等原因,未能获取有效候选;第二次连接时,NAT端口映射已被运营商短暂保留,或设备缓存了之前的候选,ICE能快速找到有效通路,因此连接成功。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:35:08