B2BUA服务器如何通过PJSUA2发送自定义SDP的re-INVITE实现媒体直连?
关于PJSUA2 B2BUA实现媒体旁路的方案
完全可行,PJSUA2并不要求始终接管媒体流,你可以通过携带双方原始SDP的re-INVITE实现媒体旁路,让通话双方直接互通。具体实现步骤如下:
核心操作步骤
- 保存双方原始远端SDP:在B2BUA分别与主叫、被叫建立会话的过程中,完整保存双方发送的远端SDP(即主叫发给B2BUA的SDP,以及被叫发给B2BUA的SDP),包括所有媒体地址、端口、ICE候选、编码参数等信息,不要做任何修改。
- 构造re-INVITE的自定义SDP:
- 向主叫发起re-INVITE时,使用被叫的原始远端SDP作为本次邀请的SDP内容;
- 向被叫发起re-INVITE时,使用主叫的原始远端SDP作为本次邀请的SDP内容。
- 通过PJSUA2发送带自定义SDP的re-INVITE:
- 创建
CallOpParam对象,设置opt.sendUpdate = true以发起更新请求; - 将预先保存的目标SDP赋值给
CallOpParam的sdp字段,例如:param.sdp = savedPeerSdp; - 调用
Call::invite(param)方法发起re-INVITE,完成SDP的传递。
- 创建
关键注意事项
- ICE候选完整性:如果通话使用ICE协议,必须确保SDP中保留对方的原始ICE候选,不要替换为B2BUA的地址,这样双方才能直接完成ICE协商,建立点对点连接。
- 媒体参数一致性:确认主叫和被叫的媒体编码、时钟速率等参数完全匹配,若初始中继时B2BUA做了编码转换,切换前需保证双方支持共同的编码集,否则直接互通会失败。
- 异常回退逻辑:若re-INVITE被对方拒绝或协商失败,要立即恢复B2BUA的媒体中继功能,避免通话中断。
内容的提问来源于stack exchange,提问作者Gavin Murphy
相关产品推荐
相关产品推荐

