星号阻塞RTP H264数据包

时间:2012-03-27 01:00:41

标签: sip blocking h.264 asterisk rtp

我有一个网络设置,在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数据包。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

首先,Asterisk不会“保留”RTP数据包。有两种方法可以桥接两个SIP UA:

  1. 本地网桥 - RTP流量流经Asterisk,但Asterisk不解释。在这种情况下,每个UA将其RTP指向Asterisk,Asterisk将RTP重新发送到每个UA。完成最少量的解码。
  2. 远程网桥 - 在这种情况下,仍然在每个UA和Asterisk之间处理信令,但是Asterisk重新协商RTP的目的地,每个UA是另一个相应的UA。最后,每个UA直接将其RTP发送给另一个UA,同时将SIP信令信息发送给Asterisk。这样可以最大限度地减少Asterisk的负载,因为没有RTP流量直接通过它。
  3. 本地网桥 - 类似于本地网桥,来自UA的RTP流量流入Asterisk。 Asterisk将RTP完全解码为音频帧并管理音频帧的传输。当Asterisk必须“理解”RTP流量的内容时,例如当使用features.conf进行DTMF传输时,就会发生这种情况。
  4. 直接媒体设置通知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地址。

  1. 我从Asterisk切换到FreeSWITCH。虽然这没有解决我的问题,但我发现FreeSWITCH更容易配置和调试,这对我的搜索有帮助。

  2. 事实证明,FreeSWITCH和Asterisk都不关心你在SIP会话期间为他们提供的IP地址,他们只需使用接收数据包的IP地址/端口(通过IP头)进行通信。这让我感到困惑,因为我可以在2个UAC之间拨打电话但是在接听电话后,音频/视频媒体永远不会到达正确的目的地。事实证明,无论SIP使用什么IP地址进行通信,RTP实施都将使用SDP消息中提供的IP地址。

  3. 最后,我使用STUN来发现呼叫UAC的公共IP /端口,并将正确的IP /端口组合插入到SDP消息中。随后,当应答UAC(Jitsi)设置其媒体流时,它现在具有正确的IP /端口组合以发送/接收媒体。