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