我有一个网络设置,在NAT后面有2个UAC(一个是Jitsi,另一个是我自己的UA编码,在C中支持SIP)。 Asterisk是在公共IP上建立的。
在sip.conf中,我对两个UAC都有以下内容:nat = yes directmedia = no
然后我执行调用Jitsi客户端的代码。我通过Jitsi回答,一切看起来都很棒。 Asterisk为每个UAC提供一个RTP主机/端口,通过我已正确解析的SDP数据包发送视频(音频不包含在此会话中)。每个用户代理开始传输RTP数据包。
以下是问题发生的地方: 星号开始打印
“从XX.XXX.XX.XXX:XXXXX获得RTP数据包(XX类型,seq XXXXX,ts XXXXXx,len XXXXXX)”
从两个UAC反复重复,但从未实际发送过任何RTP数据包(我希望“发送RTP ......”)。我通过QuickTime广播服务器测试了我的H264 RTP代码,并且数据包通过各种媒体播放器在本地网络上正确解码。我的SIP呼叫似乎没有连接问题,并且Asterisk永远不会在控制台中打印出任何警告或错误。
我不能为我的生活找出为什么Asterisk不转发RTP数据包。任何帮助将不胜感激。
答案 0 :(得分:1)
首先,Asterisk不会“保留”RTP数据包。有两种方法可以桥接两个SIP UA:
直接媒体设置通知Asterisk,UA最佳地希望在彼此之间发送媒体,并绕过Asterisk。一旦两个UA建立了呼叫,它将尝试发送必要的re-INVITE以设置该场景。
由于您为两个UA启用了直接媒体,因此Asterisk会尝试将它们放置在远程网桥中。取决于许多因素,它可能不会成功,但总的来说,它将期望它不是在UTP之间来回发送的RTP“在循环中”。这可以解释为什么它不转发从其中一个UA收到的RTP流量。
我怀疑,因为Jitsi很好地处理了这个设置,你写的UA并没有在发送给它的re-INVITE Asterisk的SDP中表达新的目标IP地址,而是继续将RTP发送到Asterisk什么时候它应该直接发送到Jitsi UA。
答案 1 :(得分:0)
我似乎需要使用STUN才能找到我的公共IP地址。
我从Asterisk切换到FreeSWITCH。虽然这没有解决我的问题,但我发现FreeSWITCH更容易配置和调试,这对我的搜索有帮助。
事实证明,FreeSWITCH和Asterisk都不关心你在SIP会话期间为他们提供的IP地址,他们只需使用接收数据包的IP地址/端口(通过IP头)进行通信。这让我感到困惑,因为我可以在2个UAC之间拨打电话但是在接听电话后,音频/视频媒体永远不会到达正确的目的地。事实证明,无论SIP使用什么IP地址进行通信,RTP实施都将使用SDP消息中提供的IP地址。
最后,我使用STUN来发现呼叫UAC的公共IP /端口,并将正确的IP /端口组合插入到SDP消息中。随后,当应答UAC(Jitsi)设置其媒体流时,它现在具有正确的IP /端口组合以发送/接收媒体。