引言
随着互联网的快速发展和语音信号处理的进步,嵌入式网络终端的VoIP技术成为目前国内外研究热点问题之一。与传统的电话网络相比,VoIP具有占用网络资源少、成本低等优势,而嵌入式设备具有的便携、高可靠、低成本和低功耗的特性,使得嵌入式网络终端的VoIP技术市场潜力巨大。但是,目前存在的VoIP系统软件(如Skype网络电话、UUCall网络电话、KC网络电话、Net meeting等)都是基于桌面计算机的,难以运行在嵌入式网络终端上。许多类库中的函数在PC上可以正常运行,而Windows CE嵌入式操作系统却不支持[1],所以研究基于嵌入式网络的VoIP技术应用有着很重要的意义。
1 嵌入式网络终端的硬件平台和操作系统
1.1 硬件平台
嵌入式网络终端VoIP的硬件平台采用三星公司基于ARM11内核(ARM1176JZFS)的S3C6410作为处理器,其系统结构如图1所示。S3C6410具有低功耗耗、高性价比的特点,可广泛应用于移动电话和通用处理等领域。S3C6410为2.5G和3G通信服务提供了优化的硬件性能,内置强大的硬件加速器,包括运动视频处理、音频处理、2D加速、显示处理和缩放等;集成了一个MFC(MultiFormat video Codec),能够支持MPEG4 /H.263/H264编解码和VC1的解码;包含了优化的外部存储器接口,该接口能满足在高端通信服务中的数据带宽要求,能够进行实时的视频会议。苹果公司的iPhone手机就是基于S3C6410处理器。另外,目前基于S3C6410 的OK6410开发板上集成了以太网接口、视频等多种高端接口,还可连接WiFi模块、GPRS模块和3G模块,为VoIP提供了强大的组网通信能力。
图1 硬件平台系统结构
1.2 操作系统
Windows CE是Microsoft公司专门针对嵌入式产品领域开发的一种紧凑、高效、可伸缩的32位操作系统,主要面向各种嵌入式系统和产品。它所具有的多线程、多任务、完全抢占式的特点是专门为各种有严格限制的硬件系统所设计的。Windows CE的模块化设计使嵌入式系统和应用程序开发者能够方便地加以定制以适应一系列产品,例如消费类电子设备、专用工业控制器和嵌入式通信设备等。VoIP是Windows CE6.0持续加强的重点,除了应用程序层更进一步的整合外,操作系统核心也具备了直接支持的能力,硬件开发人员更容易在Windows CE下进行网络语音的开发;在网络堆叠协议方面,Windows CE6.0直接支持了802.11i、802.11e和WAP2等协议。
2 嵌入式网络终端的软件设计
ITUTG.114规定,高质量语音可接受的时延是300 ms。同时ITUTG.114提出,对于VoIP网络来说,单向的时延门限为400 ms。但实际上语音信号在端到端传输过程中产生的时延有编解码时延、语音采集和播放时延、分组打包时延、网络传输时延、缓冲排队时延和处理时延等,这些时延共同作用影响语音信号质量。与数据信号相比,语音信号对丢包和误码不是非常敏感。对于IP包的丢失,典型的语音编码可以允许包丢失率为3%。采取一些特殊措施后,包丢失率达到8%~10%尚可容忍[2]。所以时延是VoIP要解决的最大问题。
2.1 VoIP语音的采集和播放
Windows CE下语音采集和语音播放主要有两种方式:一种是采用低阶音频函数WaveX系列API函数来完成,另一种是采用DirectSound技术来完成。WaveX没有硬件加速功能,CPU利用率较高,延时较大。DirectSound是DirectX API的音频组件之一,它可以提供快速混音和硬件加速功能,并且可以直接访问相关设备。DirectSound与WaveX相比,功能强大,硬件加速操作,采集和播放时产生的延时较小[3],所以这里采用DirectSound来进行音频数据的采集和播放。
首先分析声音采集的基本步骤:
① 调用DirectSoundCaptureEnumerate枚举录音设备,初始化WAVEFORMATEX结构体设置语音采集的PCM编码格式,例如采样频率、量化位数、声道等。
② 分别调用DirectSoundCaptureCreate8、CreateCaptureBuffer建立采集用的设备对象和缓冲区对象,然后调用SetNotificationPositions设置缓冲区通知,用于当缓冲区的读指针达到某预设位置时触发通知事件,提醒我们可以对某部分的数据进行传送了。
③ 调用IDirectSoundCaptureBuffer8的成员函数Start、Lock、Unlock、Stop、GetCurrentPosition来采集声音。当通知被触发后,为了防止采集过程被中断,建立一个新的线程来处理数据传送的事件。
同样在语音播放时DirectSound也提供了一系列函数。其中,DirectSoundEnumerate用来枚举播放设备,DirectSoundCreat和CreatSoundBuffer函数用来建立采播放设备对象和缓冲区对象,IDirectSoundBuffer8的成员函数Lock用来锁住缓存的位置;通过 WriteBuffer函数将音频数据写入缓冲区,写完后再通过UnLock函数解锁;调用IDirectSoundBuffer8的成员函数Play、Stop、SetCurrentPosition可以播放音频数据。
2.2 网络语音数据传输
在Windows CE下TCP和UDP是常用的网络传输协议。TCP是一种面向连接的协议,在传输数据前建立的是虚链路,不能保证各个语音包在相等的时间内到达,所以无法避免话音抖动现象。TCP提供的确认与超时重传机制、活动窗口机制等用于数据流量控制和拥塞处理,可减少丢包的发生。但正是由于实现的复杂,网络开销很大,给数据的传输带来很大的时延,音频实时传输已经成为VoIP技术中首要解决的问题之一。因此TCP协议不适合传输实时音频数据[3]。
UDP提供无连接的数据包传输,对网络的资源占用较少,网络时延也较小,但可靠性不高,有可能出现语音包的丢失和误传。经过长期反复的测试,在局域网内实现VoIP通信,丢包和误码率很低,UDP协议完全可以胜任。但是在互联网上实现VoIP通信,必须解决网络传输不可靠的问题。Windows CE也支持RTP协议,利用RTP协议可以在UDP数据包中添加时问戳和序列号等控制信息,提高网络传输的可靠性。采集的音频数据包首先以RTP协议进行封装,再用UDP协议对RTP数据包进行封装,最后封装为IP数据包,经网络进行传输[4]。采用UDP和RTP相结合的方案可以保证网络数据传输可靠,同时也保证了时延不会太大。VoIP通信过程如图2所示。
图2 VoIP通信过程
采集到的声音传输到网络的其他终端上才能完成VoIP通信,可采用Socket UDP方式来实现。WinSock API中函数封装了UDP类,可以完成UDP全部操作。首先调用socket函数来创建数据报套接字,然后指定本地端口、远程端口和远程IP地址,接着调用sendto函数和recvfrom直接发送数据和接收数据。接收数据时需要单独创建线程,并通过select事件模型来检测UDP事件,包括数据接收事件和UDP发生错误事件。
2.3 数据缓存区的设置
数据缓存区大小的设置对语音信号的质量会产生很大的影响。录音数据缓存和编码缓存区的大小必须适中。
录音缓冲区过小,生成的语音数据帧也就会过小,语音的连续性遭到破坏,同时数据分组的有效数据率也会过小,增加了网络负担[5];如果缓冲区过大,会在语音录制和其他处理时造成比较大的处理时延,还有可能造成发送的数据分组过大而导致某协议层的数据分割与合并,形成很大的传输时延。所以录音缓冲区要选择合适的大小,必须在语音的连续性和时延之间进行平衡。在工程实践中要根据语音效果来确定缓存区的大小。
编码缓存区的大小取决于录音缓存区的大小和编码方式,实际应用中要根据不同的语音编解码技术设计不同的缓冲区。参考文献[6]中采用的编解码算法是GSM610,参数为11.025 kHz的采样频率,8位单声道方式进行语音数据采集,测出不同的缓存区大小带来的时延。结论是当缓冲区设置为768字节时语音质量比较好,而且时延也可以接受。
结语
嵌入式网络终端的VoIP技术实用价值高,市场潜力巨大,但语音质量不高的现状制约了它的发展。本文针对VoIP时延大的不足,从减小语音采集和播放时延、网络传输时延和缓存区时延三方面入手提出了不同的解决方案,对在基于Windows CE的嵌入式网络终端上实现VoIP技术具有一定的参考价值。