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

集成SIP.js与react-native-webrtc时RTCP-MUX错误求助

问题分析

报错信息明确指向:RTCP-MUX is not enabled when it is required,这说明你的SIP客户端(SIP.js)生成的SDP未启用RTCP-MUX,但远端(Telnyx)要求必须使用该特性,导致SDP协商失败。RTCP-MUX是将RTCP控制流量复用在RTP媒体流的同一个端口上,是现代SIP服务商普遍要求的配置。

解决方案

针对你的代码,需要做以下几处关键修改:

  1. 强制启用RTCP-MUX
    在创建Inviter时,给sessionDescriptionHandlerOptions添加rtcpMuxPolicy: "require"参数,明确要求本地SDP必须使用RTCP-MUX。

  2. 添加STUN/TURN服务器配置
    将Telnyx提供的STUN/TURN服务器信息添加到sessionDescriptionHandlerOptions的iceServers数组中,确保ICE协商可以正常建立媒体连接。

  3. 调整全局注册时机
    把registerGlobals()移到UserAgent初始化之前执行,保证react-native-webrtc的全局API能被SIP.js正确调用。

修改后的完整代码:

import React, { useEffect, useState } from "react";
import { registerGlobals } from "react-native-webrtc";
import { Button, Platform, StyleSheet, Text, View } from "react-native";
import { Inviter, Registerer, SIPExtension, UserAgent, SessionState } from "sip.js";

// 先注册webrtc全局变量
registerGlobals()

// Create user agent instance (caller)
const userAgent = new UserAgent({
  uri: UserAgent.makeURI("sip:alice@example.com"),
  transportOptions: {
    server: "wss://sip.example.com"
  },
});

// Connect the user agent
userAgent.start().then(() => {

  // Set target destination (callee)
  const target = UserAgent.makeURI("sip:bob@example.com");
  if (!target) {
    throw new Error("Failed to create target URI.");
  }

  // Create a user agent client to establish a session
  const inviter = new Inviter(userAgent, target, {
    sessionDescriptionHandlerOptions: {
      constraints: { audio: true, video: false },
      // 强制启用RTCP-MUX
      rtcpMuxPolicy: "require",
      // 添加Telnyx的STUN/TURN服务器
      iceServers: [
        { urls: "stun:stun.telnyx.com:3478" },
        { 
          urls: "turn:turn.telnyx.com:3478",
          username: "YOUR_TELNYX_USERNAME",
          credential: "YOUR_TELNYX_CREDENTIAL"
        }
      ]
    }
  });

  // Handle outgoing session state changes
  inviter.stateChange.addListener((newState) => {
    switch (newState) {
      case SessionState.Establishing:
        console.log("Session is establishing");
        break;
      case SessionState.Established:
        console.log("Session has been established");
        break;
      case SessionState.Terminated:
        console.log("Session has terminated");
        break;
      default:
        break;
    }
  });

  // Send initial INVITE request
  inviter.invite()
    .then(() => {
      console.log("INVITE sent");
    })
    .catch((error) => {
      console.error("INVITE failed:", error);
    });

});
额外检查项
  • 替换代码中的YOUR_TELNYX_USERNAME和YOUR_TELNYX_CREDENTIAL为你在Telnyx控制台获取的TURN服务器凭证
  • 确认Telnyx SIP Trunk配置中未禁用RTCP-MUX(默认是启用状态)
  • 确保应用已获取麦克风权限:iOS需在Info.plist添加NSMicrophoneUsageDescription,Android需在AndroidManifest.xml添加<uses-permission android:name="android.permission.RECORD_AUDIO" />
  • 验证react-native-webrtc与SIP.js版本兼容,建议使用最新稳定版

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 07:32:16