基于SIP的嵌入式无线可视电话终端设计与实现
扫描二维码
随时随地手机看文章
目前,许多国家都采用H.323作为IP电话网关之间的协议,把IP电话网关作为电路交换网和IP网络的接口。但是,在下一代网络中,由于大量IP产品的应用,使得端到端必须基于纯IP网络。3GPP已经确定将SIP协议作为第三代移动通信全IP网络的控制协议。SIP(Session Initiation Protocol)协议是IETF于1999年提出的一种新的网络多媒体通信交互信令,它相对于市场主体的H.323协议具有简单、扩展性好、便于实现等优点。凭借这些优点,其得到业界的青睐,逐步成为NGN和3G多媒体子系统域中的重要协议。市场上出现越来越多支持SIP的智能多媒体终端及相关软件和软交换设备,SIP将成为IP视频电话业务的主流协议之一。
本文以S3C2410为核心,通过几个功能模块的扩展,开发出一个基于SIP的嵌入式无线视频电话终端。该终端除了具备数字化和网络化特点外,还采用了开放的SIP同其他电话设备进行通信,从而将网络中任何一台主机变成终端。同时,基于WIFI的无线网络技术使得多媒体终端具备随时部署的特点,并且逐步得到企业的认可。
1 总体方案设计
1.1 硬件系统结构
本电话终端系统的硬件方案为:使用三星公司的通用ARM芯片S3C2410配合嵌入式操作系统WINCE5.0.NET实现各种外围接口,视音频编解码处理和传输控制协议等。这样既不存在芯片成本高的问题,又能保持很高的性能,可通过简单的程序下载实现软件升级或增加新的编解码标准。系统的硬件结构框图如图1所示。实现该系统的要点是:在WINCE下添加USB摄像头和USB无线网卡驱动模块。
1.2 系统软件结构
系统硬件配置完成后,就需要定制平台和编写代码实现各个功能模块,最终实现整个系统。系统的软件结构如图2所示。
(1)用户层:用户的使用层,实现用户用键盘拨号、接听和挂断电话等操作。
(2)接口层:完成两个功能,一是作为应用层和传输层的接口—建立套接字(SOCKET);二是拥有调用模块层各个模块的接口函数。
(3)模块层:系统核心层包括:SIP模块、数据传输模块、语音和视频模块。SIP模块实现OSIP协议栈的3个模块:解析器、有限状态机和工具模块。数据传输模块中传输层使用UDP协议,用RTP/RTCP进行实时传输和控制。语音模块和视频模块分别完成语音和视频的采集与编解码。
2 无线视频电话终端的设计与实现
2.1 系统平台设计
在WinCE产品开发中,内核定制和应用程序开发是非常重要的工作。
2.2 音频编码模块的实现
系统初始化以后,音频采集编码模块对应的子线程就被创建并挂起,当用户需要采集音频数据时再分别被唤醒。音频采集编码模块主要完成语音的录制和编码。首先打开波形音频输入设备,准备好缓冲区,然后利用声卡把语音录入到准备好的缓冲区。一个缓冲区录满后,就可以对缓冲区中的数据进行编码。其中音频采集通过调用Windows低级音频API函数族WaveIn和WaveOut来实现。编码通过调用G.7XX音频接口提供的编解码器接口实现。
2.3 视频采集编码模块的实现
笔者采用了OmniVision公司的OV7650 CMOS VGA 芯片。该芯片是一款高性能图像压缩芯片,输出MJPEG视频流数据。它的误差稳定性非常好,可以获取清晰度很高的视频图像,还可以灵活设置各路视频清晰度,压缩帧数。本系统直接从摄像头驱动中获取MJPEG视频流数据,图像采集流程如图3所示。图像采集模块用到的主要函数有:
capInitCamera():用来初始化视频设备,并获取当前可用的视频设备数目。
capSetVideoFormat():设置视频格式和分辨率。本系统使用的视频格式为RGB24,分辨率为320×240像素。
capGrabFrame():从驱动中抓取1帧图像,并存储在缓存FrameBuffer中。
capGetLastJpeg():将抓取的MJPEG格式的图像转换成JPEG格式,送到无线发送模块。
视频采集部分还有查询视频采集格式、设置明暗度、设置对比度等相关函数,这里不再详述。在完成视频采集后,再对视频流进行MPEG-4的视频压缩。视频编码通过调用xvid视频解码器接口提供的编解码器接口实现。音频解码回放模块和视频解码回放模块将接收到的音频和视频数据解码后播放。视频播放则将视频数据格式转化为RGB,再用函数DrawDibDraw将其显示。
2.4 xvid解码算法在实时传输部分的优化
2.4.1 xvid解码对零系数块的处理分析
在解码过程中,如果知道图像宏块/块为零系数块,则可以直接跳过该块的解码过程(包括IQ和IDCT过程),从而大大节省解码的计算量。在MPEG-4编码器模型Xvid的程序中看到,在IDCT部分,参数CBP(编码块模式)是专门用来指示正在进行编码和不再进行编码的宏块的信息。它是一个6bit的稽核,每个都代表了一个宏块的一小块。bit的状态表示了该块是否被编码。如果块的所有系数都为零,则块就没有被编码。这个参数在进行IQ、IDCT、反向扫描和重建之前被检验,这些过程并不对CBP为零的块进行。通过CBP解码过程,在块的基础上的所有冗余计算都被减少了。
在Xvid解码程序decoder.c的decoder_mbinter()函数中,最后有如下判断:
If(cbp)
Decoder_mb_decode(dec,cbp,bs,py_cur,pu_cur,pv_cur,reduced_resolution,pMB);
由此说明在参数CBP为零的情况下是不做宏块解码工作的。
但是这里可以看出,CBP参数为零代表的是整个宏块量化后的DCT系数都为零,这里执行的是对整个宏块后续解码的跳出工作。而对于整个宏块量化后的DCT系数不全为零,只有几个8×8的块量化后的DCT系数为零的情况下,在decode.c的decoder_mb_decode()函数中有如下过程:
For(i=0;i<6;i++){
If(cbp&(1<<(5-i)))){
Memset(block,0,64*sizeof(int16_t));
Start_timer();
Get_inter_block(bs,block,direction);
Stop_coding_timer();
…
Stop_iquant_timer();
Stop_idct_timer();
}
}
从以上程序看出:由于CBP有6bit,每个bit都代表了一个宏块中的一个8×8小块,因此当相应的8×8块为零时,就直接跳过对该8×8块的反向量化和IDCT过程。
2.4.2 xvid解码中IDCT和IQ的优化
在IDCT程序中加入判断语句,把全系数IDCT根据判断前6个(精确度低一些)或者10个DCT系数的值分别进行0系数IDCT变化(直接赋零)、3系数IDCT变换、64系数IDCT变换,这样得到的程序计算量比原程序减少很多。
在这里用If判断,如果这10个DCT系数都为零,则认为此块是全0DCT系数,直接令此块的所有IDCT后的系数为零。如果前3个系数block[0]、block[1]、block[8]不全为零,后7个系数block[2]、block[3]、block[9]、block[10]、block[16]、block[17]、block[24]全为零,则认为此子块系数是3DCT系数的,直接对其进行3系数的IDCT(程序已编好)。如果上述两种都不满足,就对其进行全系数的IDCT。
判断工作在XVID程序的idct.c中进行,在原始的函数idct_int32(short*const block)中加入判断程序。
IQ部分的优化思路和IDCT优化类似,不再详述。
2.5 用户代理的实现
SIP UA模块用于会话的建立、修改、终止,起着信令控制作用。此模块使用的SIP协议栈是OSIP2和EXOSIP。
OSIP2协议栈的开发步骤为:
(1)初始化:主要调用函数osip_global_init()和osip_init(),操作代码如下:
Osip_t*osip;
if(!osip_global_init())
Return -1;
If(!osip_init())
Return -1;
Osip栈需要在运行前初始化。在使用Osip栈之前,osip_global_init()函数是第一个被调用的,并且只能调用一次。调用这个函数将初始化语法分析。
(2)注册回调函数:包括发送消息、结束事务、发送失败和4个状态机相关的函数。
(3)建立事务:在注册完回调函数后,应用可以建立用来调用OSIP的解析器。
EXOSIP有二种工作模式:事件模式和回调模式。本软件采用的是事件模式。使用一个定时器,定时到时就通过函数eXosip_wait_event()去获取SIP事件,SIP事件主要有EXOSIP_CALL_NEW、EXOSIP_CALL_ANSWERED等。事件获取后,调用相应的事件处理函数,如SipCallNew、SipCallRinging、SipCallAnswered等。要建立、修改、终止呼叫还需要调用EXOSIP的osip_build_initial_invite、eXosip_initiate_call等函数。
2.6 音视频数据传输的实现
利用RTP/RTCP实现语音视频流的实时传输。RTP负责数据发送和接收,RTCP负责网络丢包、误码情况的反馈等。通过调用JRTPLIB提供的库函数就可以开发出高质量的音/视频传输程序。
发送端调用JRTPLIB提供的库函数实现语音视频等的实时发送过程为:(1)通过调用RTPSession类的构造函数创建一个RTP会话实例,然后调用RTPSession类的方法对其初始化,设置负载类型、标识和时戳增量,以及指定流媒体的目标地址;(2)设置RTP会话参数,通过调用RTPSessionParams类的SetOwnTimeStampUnit()方法设置时间戳和RTP传输参数;(3)通过调用SendPacket()方法向目标地址发送采集编码后的音视频数据。接收端的创建RTP会话实例和RTP会话参数设置与发送端的设置相同。
本文设计和实现了一个基于SIP的嵌入式网络无线可视电话终端模型。该终端支持音频和视频的实时通信。终端之间采用开放的SIP进行通信,SIP的应用避免了采用私有协议所带来的封闭性,提高了同其他设备的互通性;同时利用WiFi技术提高了视频电话终端的便携性。SIP协议具有简单、可扩展的特性,将会在下一代网络中占有重要地位。目前对SIP在视频电话系统中的应用还处于试验阶段,能与之通信的SIP设备还不多,但随着NGN平台的建立和SIP设备的不断增多,其灵活性和互通性的优点会逐渐体现出来。支持多人的可视电话终端将是进一步要研究的课题,前景一片光明。