集成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服务商普遍要求的配置。
解决方案
针对你的代码,需要做以下几处关键修改:
强制启用RTCP-MUX
在创建Inviter时,给sessionDescriptionHandlerOptions添加rtcpMuxPolicy: "require"参数,明确要求本地SDP必须使用RTCP-MUX。添加STUN/TURN服务器配置
将Telnyx提供的STUN/TURN服务器信息添加到sessionDescriptionHandlerOptions的iceServers数组中,确保ICE协商可以正常建立媒体连接。调整全局注册时机
把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
相关产品推荐
相关产品推荐

