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

Chromium的ICE/STUN/TURN并发请求是否有限制?多WebRTC通话故障咨询

解决Chrome中并发WebRTC纯音频通话的RTP获取失败问题

针对STUN并发限制的优化

  • 调整STUN并发请求上限:
    Chromium默认存在STUN并发请求限制,可通过两种方式修改:

    • 打开chrome://flags,搜索WebRTC STUN concurrent requests limit(部分版本命名为max-concurrent-stun-requests),将值调高至120以上(匹配50-60路通话的需求)
    • 启动Chrome时添加命令行参数:--max-concurrent-stun-requests=120
  • 优化ICE候选收集逻辑:

    • 限制候选类型:只保留host(本地候选)和srflx(服务器反射候选),过滤冗余候选以减少STUN请求数量,可通过监听icecandidate事件手动筛选:
      pc.onicecandidate = (event) => {
        if (event.candidate) {
          const { type } = event.candidate;
          if (type === 'host' || type === 'srflx') {
            // 将符合条件的候选发送给远端
          }
        }
      };
      
    • 启用ICE Lite模式:若服务器支持ICE Lite,客户端STUN请求会大幅减少——ICE Lite服务器仅响应客户端连接检查,不会主动发起请求,降低整体协商负载。

RTCPeerConnection层面的优化

  • 复用音频轨道:
    多路通话共享同一个MediaStreamTrack,减少音频设备占用和内部资源消耗,同时降低ICE协商负载:

    const audioTrack = await navigator.mediaDevices.getUserMedia({ audio: true })
      .then(stream => stream.getAudioTracks()[0]);
    
    // 为每个PeerConnection添加同一轨道
    const pc1 = new RTCPeerConnection(config);
    pc1.addTrack(audioTrack, new MediaStream([audioTrack]));
    
    const pc2 = new RTCPeerConnection(config);
    pc2.addTrack(audioTrack, new MediaStream([audioTrack]));
    
  • 启用媒体捆绑:
    在RTCConfiguration中设置bundlePolicy: 'max-bundle',将所有媒体流捆绑到单个传输通道,每路通话仅需一组ICE候选,减少STUN请求总量:

    const config = {
      iceServers: [{ urls: 'stun:your-stun-server' }],
      bundlePolicy: 'max-bundle'
    };
    

Chromium底层资源限制调整

  • 修改启动参数:
    添加以下命令行参数启动Chrome,提升WebRTC资源配额:

    • --webrtc-max-concurrent-peer-connections=60:直接设置最大并发PeerConnection数量
    • --webrtc-audio-max-channels=64:提高支持的音频通道数
    • --webrtc-max-cpu-consumption-percentage=100:放宽WebRTC的CPU占用限制,避免资源不足导致协商失败
  • 调整Chrome Flags:
    打开chrome://flags,启用并调整以下选项:

    • #webrtc-enable-multiple-renderers:启用多渲染器支持,适配多路通话场景
    • #webrtc-legacy-api:若使用旧版API,可尝试启用该选项(部分场景下兼容性更好)

其他实用优化手段

  • 分批发起通话协商:
    不同时启动所有通话的ICE协商,每路通话之间添加100-200ms延迟,避免瞬间触发STUN请求上限:

    async function createBatchConnections(total) {
      const connections = [];
      for (let i = 0; i < total; i++) {
        const pc = new RTCPeerConnection(config);
        // 完成PeerConnection基础配置
        connections.push(pc);
        // 添加延迟
        await new Promise(resolve => setTimeout(resolve, 150));
      }
      return connections;
    }
    
  • 强制使用TURN中继:
    将RTCConfiguration中的iceTransportPolicy设为'relay',强制所有流量通过TURN服务器中继,彻底绕过STUN并发限制(前提是TURN服务器能支撑对应并发量):

    const config = {
      iceServers: [{ urls: 'turn:your-turn-server', username: 'xxx', credential: 'xxx' }],
      iceTransportPolicy: 'relay'
    };
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:39:53