【问题标题】:Asterisk blocking RTP H264 packetsAsterisk 阻止 RTP H264 数据包
【发布时间】:2012-03-27 01:00:40
【问题描述】:

我的网络在 NAT 后面设置了 2 个 UAC(一个是 Jitsi,另一个是我自己的 UA,用 C 编码,支持 SIP)。 Asterisk 设置在公共 IP 上。

在 sip.conf 中,两个 UAC 都有以下内容:nat=yes directmedia=no

然后我执行调用 Jitsi 客户端的代码。我通过 Jitsi 回答,一切似乎都很好。 Asterisk 为每个 UAC 提供一个 RTP 主机/端口,以通过我已适当解析的 SDP 数据包向其发送视频(此会话中不包括音频)。每个用户代理都开始传输 RTP 数据包。

这里是问题发生的地方: Asterisks 开始打印

"从 XX.XXX.XX.XXX:XXXXX (type XX, seq XXXXX, ts XXXXXx, len XXXXXX) 得到 RTP 数据包"

从两个 UAC 重复但实际上从未在任何地方发送任何 RTP 数据包(我希望“发送 RTP ....”)。

我已经通过 QuickTime 广播服务器测试了我的 H264 RTP 代码,并且数据包通过各种媒体播放器在本地网络上正确解码。我的 SIP 呼叫连接似乎没有问题,而且 Asterisk 从未在控制台中打印出任何警告或错误。

我一生都无法弄清楚为什么 Asterisk 不转发 RTP 数据包。任何帮助将不胜感激。

【问题讨论】:

  • 您是否提高了 Asterisk 日志记录的详细程度以查看它是否提供任何提示?它曾经是 core set verbose 5 和/或 core set debug 5 之类的东西。虽然我使用 Asterisk 已经有一段时间了,但命令格式可能已经改变。
  • 我通过 asteriks -rvvvvvvvvvvv 运行星号。我已经搜索了调试输出,据我所知,调用的建立方式没有问题。
  • 曾经还有一个 rtp 调试控制台命令,它会为每个遍历服务器的 RTP 数据包脱口而出日志消息。
  • 是的,它是 rtp 设置调试开/关/ip。这就是我如何得到“从 .... 获得 RTP 数据包”控制台消息。

标签: sip blocking h.264 asterisk rtp


【解决方案1】:

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

  1. 本地网桥 - RTP 流量流经 Asterisk,但不被 Asterisk 解释。在这种情况下,每个 UA 将其 RTP 指向 Asterisk,Asterisk 将 RTP 重传给每个 UA。完成了最少量的解码。
  2. 远程网桥 - 在这种情况下,仍然在每个 UA 和 Asterisk 之间处理信令,但 Asterisk 与每个 UA 重新协商 RTP 的目的地,使其成为另一个对应的 UA。最后,每个 UA 将自己的 RTP 直接发送给另一个 UA,同时将 SIP 信令信息发送给 Asterisk。这最大限度地减少了 Asterisk 上的负载,因为没有 RTP 流量直接通过它。
  3. 本地网桥 - 类似于本地网桥,来自 UA 的 RTP 流量流入 Asterisk。 Asterisk 将 RTP 完全解码为音频帧并管理音频帧的传输。这发生在 Asterisk 必须“理解”RTP 流量的内容时,例如在使用 features.conf 进行 DTMF 传输时。

directmedia 设置通知 Asterisk UA 最希望在彼此之间发送他们的媒体,并绕过 Asterisk。一旦两个 UA 都建立了呼叫,它将尝试发送必要的重新邀请来设置该场景。

因为你的两个 UA 都启用了 directmedia,Asterisk 会尝试将它们放置在一个远程网桥中。它可能不会成功,这取决于许多因素,但一般来说,它不会在 UA 之间来回发送 RTP 方面“处于循环中”。这可以解释为什么它不转发从其 UA 之一接收到的 RTP 流量。

我怀疑,由于 Jitsi 很好地处理了这个设置,你写的 UA 没有遵守发送给它的 re-INVITE Asterisk 的 SDP 中的新目标 IP 地址,而是继续将 RTP 发送到 Asterisk何时应该将其直接发送到 Jitsi UA。

【讨论】:

  • 感谢您的建议,考虑到您为此付出了多少想法,我深表歉意,但实际上我混淆了 nat 和 directmedia 的设置。我已经适当地编辑了我的问题。
  • 理想情况下,我想要一个本地网桥,因为它可以处理我遇到的大多数 NAT 问题。此外,我目前不考虑音频,只考虑 H.264 视频。
  • 媒体的类型无关紧要,只要每个对等体在 sip.conf 中配置为支持该媒体,并且每个 UA 在呼叫建立期间协商所需的媒体。
  • 但是,再次,您应该能够在调试日志中确认网桥类型。鉴于您尚未真正发布完整的 sip.conf、传递给 Dial 应用程序的参数或检查您的 DEBUG 日志,您要求进行大量推测而不提供所有信息。然而,我猜想,Asterisk 使用的网桥类型不是你的问题,你很可能在网络配置或 UA 实现中遇到错误。
【解决方案2】:

看来我需要使用 STUN 才能找到我的公共 IP 地址。

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

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

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

【讨论】:

    猜你喜欢
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2017-02-17
    相关资源
    最近更新 更多