fix(webrtc): 更新ICE服务器配置,新增备用TURN服务器并修复iOS模拟器连接问题

- 新增47.242.112.133的STUN/TURN服务器作为备用中继
- Flutter端添加turns: TLS中继,修复iOS模拟器无法获取relay候选的问题
- Web端同步添加新的ICE服务器配置
- 添加.gitignore忽略IDE配置文件
This commit is contained in:
2026-07-31 22:19:09 +08:00
parent 8935dc93d2
commit 6d729f38be
5 changed files with 34 additions and 11 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
.DS_Store
/.idea/

View File

@@ -284,8 +284,10 @@ public class WebRtcClient {
// 建议:如果你有 TURN 服务器,请务必在此处添加,例如: // 建议:如果你有 TURN 服务器,请务必在此处添加,例如:
// iceServers.add(PeerConnection.IceServer.builder("turn:your_turn_server").setUsername("user").setPassword("pass").createIceServer()); // iceServers.add(PeerConnection.IceServer.builder("turn:your_turn_server").setUsername("user").setPassword("pass").createIceServer());
iceServers.add(PeerConnection.IceServer.builder("turn:175.178.213.60:3478").setUsername("fanhuitong").setPassword("Fan19961207..").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("turn:175.178.213.60:3478").setUsername("fanhuitong").setPassword("Fan19961207..").createIceServer());
// iceServers.add(PeerConnection.IceServer.builder("turn:192.168.5.224:3478").setUsername("tt").setPassword("fht").createIceServer());
iceServers.add(PeerConnection.IceServer.builder("stun:175.178.213.60:3478").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("stun:175.178.213.60:3478").createIceServer());
iceServers.add(PeerConnection.IceServer.builder("turn:47.242.112.133:3478").setUsername("ttstd").setPassword("fanhuitong").createIceServer());
iceServers.add(PeerConnection.IceServer.builder("stun:47.242.112.133:3478").createIceServer());
// iceServers.add(PeerConnection.IceServer.builder("turn:192.168.5.224:3478").setUsername("tt").setPassword("fht").createIceServer());
// iceServers.add(PeerConnection.IceServer.builder("stun:192.168.5.224:3478").createIceServer()); // iceServers.add(PeerConnection.IceServer.builder("stun:192.168.5.224:3478").createIceServer());
iceServers.add(PeerConnection.IceServer.builder("stun:stun.l.google.com:19302").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("stun:stun.l.google.com:19302").createIceServer());
iceServers.add(PeerConnection.IceServer.builder("stun:stun1.l.google.com:19302").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("stun:stun1.l.google.com:19302").createIceServer());

View File

@@ -125,8 +125,10 @@ public class WebRtcClient {
// 添加 STUN 和 TURN 服务器 // 添加 STUN 和 TURN 服务器
// 注意:如果是 TURN 服务器,必须使用 turn: 前缀 // 注意:如果是 TURN 服务器,必须使用 turn: 前缀
iceServers.add(PeerConnection.IceServer.builder("turn:175.178.213.60:3478").setUsername("fanhuitong").setPassword("Fan19961207..").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("turn:175.178.213.60:3478").setUsername("fanhuitong").setPassword("Fan19961207..").createIceServer());
// iceServers.add(PeerConnection.IceServer.builder("turn:192.168.5.224:3478").setUsername("tt").setPassword("fht").createIceServer());
iceServers.add(PeerConnection.IceServer.builder("stun:175.178.213.60:3478").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("stun:175.178.213.60:3478").createIceServer());
iceServers.add(PeerConnection.IceServer.builder("turn:47.242.112.133:3478").setUsername("ttstd").setPassword("fanhuitong").createIceServer());
iceServers.add(PeerConnection.IceServer.builder("stun:47.242.112.133:3478").createIceServer());
// iceServers.add(PeerConnection.IceServer.builder("turn:192.168.5.224:3478").setUsername("tt").setPassword("fht").createIceServer());
// iceServers.add(PeerConnection.IceServer.builder("stun:192.168.5.224:3478").createIceServer()); // iceServers.add(PeerConnection.IceServer.builder("stun:192.168.5.224:3478").createIceServer());
iceServers.add(PeerConnection.IceServer.builder("stun:stun.l.google.com:19302").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("stun:stun.l.google.com:19302").createIceServer());
iceServers.add(PeerConnection.IceServer.builder("stun:stun1.l.google.com:19302").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("stun:stun1.l.google.com:19302").createIceServer());

View File

@@ -10,13 +10,15 @@ const videoRecorder = new VideoRecorder();
// 与 Android/Flutter 端一致的 ICE 配置(请按需替换为自己的 TURN 凭据)。 // 与 Android/Flutter 端一致的 ICE 配置(请按需替换为自己的 TURN 凭据)。
export const DEFAULT_ICE_SERVERS = [ export const DEFAULT_ICE_SERVERS = [
// 公共 TURNrelay 兜底UDP + TCP 两种传输TCP 用于 UDP 被防火墙拦截的网络。 // 公共 TURNrelay 兜底UDP + TCP 两种传输TCP 用于 UDP 被防火墙拦截的网络。
{ urls: 'stun:175.178.213.60:3478' },
{ urls: 'turn:175.178.213.60:3478', username: 'fanhuitong', credential: 'Fan19961207..' }, { urls: 'turn:175.178.213.60:3478', username: 'fanhuitong', credential: 'Fan19961207..' },
{ urls: 'turn:175.178.213.60:3478?transport=tcp', username: 'fanhuitong', credential: 'Fan19961207..' }, { urls: 'turn:175.178.213.60:3478?transport=tcp', username: 'fanhuitong', credential: 'Fan19961207..' },
{ urls: 'stun:47.242.112.133:3478' },
{ urls: 'turn:47.242.112.133:3478', username: 'ttstd', credential: 'fanhuitong' },
// 内网 TURN与被控端同局域网时可用 // 内网 TURN与被控端同局域网时可用
// { urls: 'stun:192.168.5.224:3478' },
// { urls: 'turn:192.168.100.224:3478', username: 'tt', credential: 'fht' }, // { urls: 'turn:192.168.100.224:3478', username: 'tt', credential: 'fht' },
// { urls: 'turn:192.168.100.224:3478?transport=tcp', username: 'tt', credential: 'fht' }, // { urls: 'turn:192.168.100.224:3478?transport=tcp', username: 'tt', credential: 'fht' },
{ urls: 'stun:175.178.213.60:3478' },
// { urls: 'stun:192.168.5.224:3478' },
// { urls: 'stun:stun.l.google.com:19302' }, // { urls: 'stun:stun.l.google.com:19302' },
// { urls: 'stun:stun1.l.google.com:19302' }, // { urls: 'stun:stun1.l.google.com:19302' },
// { urls: 'stun:stun2.l.google.com:19302' }, // { urls: 'stun:stun2.l.google.com:19302' },

View File

@@ -8,17 +8,26 @@
/// `ICE Checking -> Failed`。已修正为与 iOS 原生项目相同的服务器。 /// `ICE Checking -> Failed`。已修正为与 iOS 原生项目相同的服务器。
/// ICE 服务器配置。 /// ICE 服务器配置。
/// ///
/// 与「被控端 Android」完全一致(同一台 TURN 服务器、同一凭据 /// 与「被控端 Android」同一台 TURN 服务器175.178.213.60、同一凭据
/// 并额外补充 `?transport=tcp` 的 TURN 候选作为 iOS 模拟器兜底: /// fanhuitong / Fan19961907..)。
/// - 被控端已用 `175.178.213.60:3478`fanhuitong / Fan19961907..)成功产出 ///
/// relay 候选(见日志 `relay raddr 175.178.213.60`),故控制端用同一台、 /// **iOS 模拟器关键修复**
/// 同一凭据即可在 TURN 中继相遇; /// 明文 `turn:175.178.213.60:3478` 在 iOS 模拟器libwebrtc下不会发起
/// - 内网 `192.168.5.224` 在模拟器上不可达,已排除; /// RELAY 分配请求,导致控制端本地候选缺失 `typ relay`,两端无公共中继可
/// - 模拟器 UDP 不稳,保留 TCP 中继候选 /// 配对 → candidate-pair=0 → ICE FailedAndroid 真机/网页则正常)
/// 改用 `turns:`TLS over TCP 5349模拟器能稳定拿到 relay 候选。
/// 同时保留 udp / tcp 明文项作为降级,以及 STUN 用于 srflx。
const List<Map<String, dynamic>> kIceServers = [ const List<Map<String, dynamic>> kIceServers = [
{'urls': 'stun:stun.l.google.com:19302'}, {'urls': 'stun:stun.l.google.com:19302'},
{'urls': 'stun:175.178.213.60:3478'}, {'urls': 'stun:175.178.213.60:3478'},
{ {
// 首选TLS over TCPiOS 模拟器下能稳定分配 relay 候选。
'urls': 'turns:175.178.213.60:5349',
'username': 'fanhuitong',
'credential': 'Fan19961907..',
},
{
// 降级:明文 UDP/TCP。
'urls': 'turn:175.178.213.60:3478', 'urls': 'turn:175.178.213.60:3478',
'username': 'fanhuitong', 'username': 'fanhuitong',
'credential': 'Fan19961907..', 'credential': 'Fan19961907..',
@@ -28,6 +37,12 @@ const List<Map<String, dynamic>> kIceServers = [
'username': 'fanhuitong', 'username': 'fanhuitong',
'credential': 'Fan19961907..', 'credential': 'Fan19961907..',
}, },
{'urls': 'stun:47.242.112.133:3478'},
{
'urls': 'turn:47.242.112.133:3478',
'username': 'ttstd',
'credential': 'fanhuitong',
},
]; ];
/// 信令 WebSocket 默认地址。 /// 信令 WebSocket 默认地址。