Python 如何启动SIP(会话启动协议)并通过RTP(实时传输协议)传输媒体(语音)

Python 如何启动SIP(会话启动协议)并通过RTP(实时传输协议)传输媒体(语音),python,sip,rtp,Python,Sip,Rtp,我正在从事一个项目,在这个项目中,我需要编写一个服务器来启动与连接客户端和远程软交换机的SIP会话。一旦会话启动,语音流应使用实时传输协议在端点之间来回传输。鉴于我的上述情况,我有几个问题要问如何着手解决这个问题 1) SIP是如何启动的? 我知道SIP通常由IP电信设备中的SIP客户端发起。但是,如果您想以编程方式启动SIP会话,那么在没有SIP客户机的情况下如何启动?目前我正在使用Python,所以我遇到了几个库。比如(看起来太复杂了,不确定它是否能做我想要的),然后是,看起来很有希望 我还

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

1) SIP是如何启动的? 我知道SIP通常由IP电信设备中的SIP客户端发起。但是,如果您想以编程方式启动SIP会话,那么在没有SIP客户机的情况下如何启动?目前我正在使用Python,所以我遇到了几个库。比如(看起来太复杂了,不确定它是否能做我想要的),然后是,看起来很有希望

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

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

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

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

中的SDP中描述了SIP协议。如果你在谷歌上搜索一下,你会发现很多SIP通信的例子

2) 您是对的,SIP不提供传输/接收媒体流的服务。SIP可用于让另一方知道您要设置媒体会话并协商具体事宜。必须单独发送/接收媒体流;同样,你可以使用图书馆或自己动手

RTP流(请参阅)只是这种媒体流的一个示例。发送RTP流意味着发送RTP数据包的连续流(通常作为UDP数据包的一部分)。每个数据包都包含RTP数据:一个RTP报头和RTP负载(实际的音频样本)

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


我希望这有帮助。

软交换也是SIP用户代理吗?嘿,伙计,谢谢你的回答。实际上,我通过编写自己的SIP库来生成SIP消息。我用运行在同一网络上的SIP服务器测试了我的脚本,一切正常。但是,当我试图通过防火墙将邀请发送到另一个网络上的SIP服务器时,我的数据包被防火墙阻止。我发布了一个关于这个问题的新问题。请就此提供一些见解。我有。SIP和防火墙(NAT)被证明是一场艰难的比赛。主要是因为SIP消息中使用的IP地址仅在防火墙的一侧有效。@Vino是您的代码是开源的。。。我正在做一些类似的工作,你能分享一些资源吗。