如何通过RTP(实时传输协议)发起SIP(会话发起协议)和传输媒体(语音)

How to initiate a SIP (session initiation protocol) and transfer media (voice) through RTP (real time transport protocol)

我正在做一个项目,我需要编写一个服务器来启动与连接的客户端和远程软交换机的 SIP 会话。会话启动后,应使用实时传输协议在端点之间来回传输语音流。鉴于我的上述情况,我有几个关于如何解决这个问题的问题。

1) SIP是如何发起的? 我确实了解 SIP 通常由 IP 电信设备中的 SIP 客户端发起。但是,如果您想以编程方式启动 SIP 会话,那么在没有 SIP 客户端的情况下如何进行呢?目前我正在使用 Python,所以我遇到了一些库。喜欢 simplesip (which looks overly complicated and not sure if it can do what I want), then there is sippy,看起来很有希望。

我也在想能不能通过程序手动创建SIP/SDP包,尝试发起SIP会话。我觉得我正在通过尝试这样做来重新发明轮子。所以我的问题是如何以编程方式启动 SIP 会话?如果使用库,有哪些好的库。或者在程序中手动创建和发送SIP数据包是否可以?

2) 在 SIP 期间创建 RTP 时,如何将此 RTP 通道引用到远程设备,以便它可以使用此引用的 RTP 通道? 在网上搜索时,有人告诉我 SIP 不提供传输媒体的服务,而只是创建一个会话。实际上,RTP 完成了实时处理任务的繁重工作。因此,当启动 RTP 时,这在软件术语中的真正含义是什么。它是一个可以引用到设备的对象吗?我怎样才能将媒体流添加到此 RTP?

  1. 设置和维护 SIP sessions 是通过以 Internet 消息格式(参见 RFC 5322)发送和接收消息来完成的:文本消息,通常使用 UDP 或 TCP 发送。这完全取决于发送什么消息以及何时发送。 SIP 库可以帮助您(以及 sending/receiving RTP 流),但如果您知道如何发送 UDP 消息,您也可以轻松地自己完成。

简而言之:建立一个SIPsession你发送一个SIP INVITE请求消息,对方returnsSIP INVITE响应消息你完成session发起发送SIP ACK 消息。通常,INVITE 请求将在其 body 中包含 SDP 提议,指定客户端 willing/able 接收哪种媒体以及在哪个 IP address/port 上接收。然后 INVITE 响应包含一个 SDP 应答,为另一方指定相同的应答。

SIP 协议在RFC 3261, SDP in SDP 4566 中有描述。如果你 google 有点,你可以找到很多 SIP 通信的例子。

  1. 你说得对,SIP 不向 transmit/receive 媒体流提供服务。 SIP 可用于让另一方知道您要设置媒体 session 并协商具体细节。 Sending/receiving 媒体流必须单独完成;同样,您可以使用图书馆或自己动手。

RTP 流(参见 RFC 3550)只是此类媒体流的一个示例。发送 RTP 流意味着发送连续的 RTP 数据包流(通常作为 UDP 数据包的一部分)。每个数据包都包含 RTP 数据:RTP header 和 RTP 负载(实际音频样本)。

运作方式: 发送方对其本地音频进行采样。每次它有(例如)20 毫秒的音频样本时,它都会创建一个 RTP 数据包并将其作为 UDP 数据包中的有效负载发送。这意味着它每 20 毫秒发送一个数据包,创建一个数据包流:RTP 流。接收方缓冲这些数据包并使用每个数据包中的音频样本重新创建音频。

希望对您有所帮助。