基于SIP协议的音视频的软件开发
- 格式:docx
- 大小:26.92 KB
- 文档页数:14
基于SIP协议的音视频的软件开发 前言 在VoIP中,我们知道SIP协议有很大的用处。这里,我们就针对SIP协议,来看看SIP软电话开发环境的建立都需要知道哪方面的知识。那么首先我们来看看这个开发平台的条件。要在windows或者linux平台下开发基于SIP软电话,需要以下软件。
服务器端软件: 注册多个客户端到服务器上,可以进行通话测试 SIP客户端软件:主要用于测试,可以对别人已经完成的客户端进行抓包,以比对自己程序的发包数据
SIP协议栈:基于某个现成的SIP协议栈来开发会加快开发进度 RTP栈:传输语言或者视频数据的协议栈
抓包测试工具:调试网络程序最有效的办法 以下介绍这些软件主要以开源软件为主 一 服务器端软件 1. Asterisk:Linux系统下开源的IPPBX,功能强大稳定,主要用c语言开发。配置稍麻烦。
2. Vocal:Linux系统下开源的SIP服务器端。可以作为IPPBX也可以作为运营系统。很多voip虚拟运营商都用这个作为自己的运营系统。提供BS结构的管理界面。
3. YATE:跨平台(Linux,Windows)的开源SIP服务器端。在windows下安装非常简单。其他方面没有进行过测试。
4. SER:Linux平台下重量级的SIP服务器断。功能比较丰富,也是很多voip虚拟运营商的系统选择。不过据说配置比较麻烦,具体没有试过。 5. sipX:Linux平台下的SIP服务器。这个好像不能作为客户端再次注册到其他SIP服务器上。提供BS结构的管理界面。
二 SIP客户端软件 1. Windows Messenger 5.1:微软出的SIP客户端,操作方便。 2. YATE Client:跨平台(Linux,Windows)的开源SIP客户端软件。安装方便,功能简单。
3. xten:windows平台下的SIP软电话。功能齐全,使用方便。 三 SIP协议栈 1. osip:跨平台的开源SIP协议栈。用c语言实现,体积小。 2. exosip:对osip进行封装,使其方便SIP客户端软件开发。同样开源跨平台。
3. sipXtackLib:由SIPfoundry提供的开源跨平台的SIP协议栈,功能齐全。C++开发,已经被用于开发数个商业SIP终端。
四 RTP栈 1. JRTPLIB: 开源的跨平台rtp栈,用C++语言开发,使用方便。 五 抓包测试工具 1. Wireshark:非常有名的开源跨平台网络抓包工具,以前叫做Ethereal。 内容:
SIP是一个会话协议,很多大企业都在用,通信行业的一个标准(不过从个人角度不喜欢这个协议格式,罗嗦).
其业务逻辑比较,简单地来说如下: User Agent Server ------------------REGISTER-----------> <----------401(407) Unauthorized-- ----------REG(带上用户口令)-----------> ---------------200 OK 1 Bindings--- 双方交互几次,注册成功。 因为Sip 通信一般采用UDP,所以有个保活的问题,一般每隔两三分钟再向server注册一下。server也可能每隔一两分钟向客户发Unauthorized,让客户再刷新一下登录。
登录成功后,某个客户端向另一个客户端发起呼叫,通过服务器中转命令。简单来讲,这个和IM的原理是一样的。对方同意接收呼叫后,把媒体端口通知给
server 及对方。到了这里,有IM开发经验的人,自然就知道下一步怎么做了:如果想P2P直连的话,就先穿透NAT打洞,否则就通过Server中转。
很明显,SIP会话和现有的IM类似,但效率或效果上来讲差的很多,比如登录保活, 还是同名用户同时登录等等,都处理的不够好。不过SIP是电信协议,最初是用在VOIP和可视电话上,环境比IM简单地多,所以这个协议足够用了,估计名字中的S也是因为这个原因。
sip呼叫成功,建立连接之后,媒体传输(音视频)是通过RTP协议进行的。简单地说,采集到声音和视频,先按指定编码方面编码,比如音频编码成 g711,视频编码成h263,然后根据RFC相关协议加上包头用UDP向指定发送出去。对方收到后先解包,再解码,然后播放。
如果想了解SIP的详细工作流程,可以这样: 1 找一个外网的sip server (如果有经验,可以用yate2,或Trixbox等自己搭建) 2 安装x-lite ( 很不错的sip软电话客户端,如果安装eyeBeam更好,带视频) 3 安装ethereal和WinPcap (抓包工具)
然后,用x-lite拨打其他的客户端或SIP话机,用抓包工具抓出相关的数据包,先看流程,然后再看包结构。
后面附上一个介绍SIP的PPT,写的非常好,可能是台湾方面出品,以前收集的。是个.rar文件,因为这里只能上传图片,所以改名为.jpg再上传,下载后把.jpg去掉解压就可以了。
PPT写的非常好,用心看,很快就能了解SIP的工作流程。 下一步,就是自己动手实现SIP VOIP系统了。 如果商用的话,server 采用Trixbox,也可以仔细研究一下 Asterisk。客户端就用x-lite好了。
做为程序员,第一反应就是怎么样自己动手写一个客户端,甚至服务器。好在开源产品众多,写一个并不难。
经过几天的调试,发现几个协议栈做的不错: 1 SIP协议栈: a osip+exosip (建立客户端及通信非常简单,质量也好), b reSIProcate (全面,有server端例子,综合调试方便)。 c 其他的还用过一个pjsip,不过它与音视频结合成一个库之后, 音频质量不好。但是比较小巧, 听说台湾很 多嵌入设备采用。
2 RTP协议栈: a Linphone采用的是oRTP,音视频部分采用的是 MediaStreamer2 b JRtpLib,结合emiplib的音视频处理。 c ffmpeg,ffmpeg本来是专门处理音视频编解码的,不过也提供了 rtp,rtsp,最近好象也增加了rtmp协议的支持。顺便一提,MS2和 emiplib底层也采用了ffmpeg。只要和音视频打交道,并且质量很不错的产品,都离不开它,比如mplayer,ffdshow。顺便BS一下 kmplayer,上了ffmpeg黑名单。
这里面着重提到的是jrtplib,之前误解为它只是按RTP传输数据包,以前写过的几个文章,都是在RTP包之后,自己再封装了一下,当然,做为自己用 的音视频聊天程序,这样是没问题的。但用在SIP及其他VOIP产品上,要考虑互通,就要严格搂RTP协议来执行了。
了解了几个开源的东西,下面自己动手建一个简单的SIP环境: 1 对Linux比较熟的人, 在CentOS上安装Asterisk,客户端采用Linphone,自己研究吧。
2 象我这样只要在Linux下用点g++的,如果想针对VOIP快速学习的话,服务器安装yate2,客户端随便拿哪个都行。
3 如果自己想定制sip server,干脆一步到位,下载reSIProcate,用vc2005编译,一次通过。运行时提示缺少几个dll,google一下很快都找到了,然后运行repro,做为server先临时用着,反正是学习。
客户端呢,网上流行一个很不错的,名字叫Youtoo,下载,简单编译后可以做为一个语音的客户端使用。
然后,PC上安装几个虚拟机,一个运行server,一个运行x-lite(做为一个参考的标准),主要上运行我们自己写的客户端进行测试。如果要调试server,就是主机上运行repro,虚拟上分别运行两个x-lite。 环境搭建立好了,下一步就开始调试。 根据这几天的实践,找出了一个最优的配置:
1 sip server采用Trixbox,如果对Linux很熟建议直接用Asterisk. 2 客户端如果直接使用,建议ekiga. 顺便说一下几个客户端使用的感受: 1 linphone:好象名气不小,不过,最新版3.1.2安装后启动就崩溃。我安装的是普通的XP-SP3,电脑公司特别版。一般软件运行没问题。如果在这个平台上都崩溃,真不知道说什么好。
后来再试3.1.1,这个可以启动,运行能看到视频图像。不过奇怪的是,与视频电话连接上视频窗口反而隐藏起来。结束通话,又显示出来。搞不懂它的视频功能是做什么用的。另外显示本地视频只支持QCIF。
2 eyeBeam :名气更大,使用起来也不错,这个不错不包含视频功能。如果启动了视频的话,只显示第一帧图,摄像头怎么转它也不动。另外,主动连视频电话时,不能启动视频功能。视频电话呼叫它才能启动。启动后,"Start Video"点一下又灰住,完全不能用。
3 Wengo不错,现在改名叫Quate了,连接摄像头非常快,本地预览也正常。不过,解码有问题,看 到的是一堆绿色图块,不知道是它解不了码,还是弄几个颜色块在那边骗人玩。
4 yate好象不支持视频,不过声音倒是不错。 5 回头再说ekiga,边续试用了上面几个软件,以为我用的视频电话硬件有问题,但用ekiga连接后,双方的视频都正常。 上面是从视频效果角度出发来评测的,如果不使用视频的话都差不多。
搭建好环境,测试通过,熟悉协议之后, 就是自己做一个这样的平台了。 服务器想都不用想,直接用Tixbox,重头写不现实。
至于客户端,一般的程序架构应该如下: 一 协议部分: 主要处理sip的注册,呼叫,接收,挂机等功能,所有的协议都差不多,随便选一个就行。
二 媒体传输,这部分比较复杂 :