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

时间:2017-12-19 23:34:14

标签: python sip rtp

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

1) SIP是如何启动的? 我知道SIP通常由IP电信设备中的SIP客户端发起。但是,如果您想以编程方式启动SIP会话,那么如果没有SIP客户端,您又如何做?目前我正在使用Python,所以我遇到了一些库。就像simplesip(看起来过于复杂并且不确定它是否可以做我想要的那样),然后有sippy,看起来很有希望。

我还在考虑是否可以通过程序手动创建SIP / SDP数据包并尝试启动SIP会话。我觉得我正试图通过这样做来重新发明轮子。所以我的问题是如何以编程方式启动SIP会话?如果使用库,那么什么是好的库。或者可以在程序中手动创建和发送SIP数据包吗?

2)在SIP期间创建RTP时,如何将此RTP通道引用到远程设备,以便它可以使用此引用的RTP通道? 在线研究时,我被告知SIP不提供传输媒体的服务,只是创建一个会话。实际上RTP实时处理繁重的工作。因此,当启动RTP时,这在软件术语中意味着什么。它是一个可以引用设备的对象吗?我怎样才能为这个RTP添加媒体流?

1 个答案:

答案 0 :(得分:2)

1)通过以Internet消息格式(请参阅RFC 5322)发送和接收消息来完成SIP会话的设置和维护:通常使用UDP或TCP发送的文本消息。关于要发送什么消息以及何时发送消息都是关键。 SIP库可以帮助您(以及发送/接收RTP流),但如果您只知道如何发送UDP消息,则可以自己轻松完成。

简而言之:要设置SIP会话,发送SIP INVITE请求消息,另一方返回SIP INVITE响应消息,您通过发送SIP ACK消息完成会话发起。通常,INVITE请求将在其正文中包含SDP提议,指定客户端愿意/能够接收的媒体类型以及IP地址/端口。然后,INVITE响应包含一个SDP答案,为另一方指定相同的答案。

SIP RFC 3261中的SDP 4566,SDP中描述了SIP协议。如果你稍微谷歌,你可以找到很多SIP通信的例子。

2)你说得对,SIP并不提供发送/接收媒体流的服务。 SIP可用于让另一方知道您要设置媒体会话并协商具体细节。发送/接收媒体流必须单独进行;再次,你可以使用一个库或自己做。

RTP流(参见RFC 3550)只是这种媒体流的一个例子。发送RTP流意味着发送连续的RTP数据包流(通常作为UDP数据包的一部分)。每个数据包都包含RTP数据:RTP头和RTP有效载荷(实际音频样本)。

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

我希望这会有所帮助。