嵌入式网络终端的语音传输系统设计
扫描二维码
随时随地手机看文章
摘要:根据嵌入式网络终端的特点及VOIP技术原理,设计了一款基于WinCE的嵌入式语音传输系统。此系统实现了嵌入式网络终端之间的语音通信,以及网络终端和PC机之间的语音通信功能,具有较强的可扩展性。
关键词:嵌入式网络终端;语音;VOIP;WinCE
引言
嵌入式系统因其满足系统对功能、可靠性、成本、体积、功耗的要求,已经被广泛地应用在交通、商业/金融、工业控制、医疗等各个领域。目前,嵌入式网络应用技术已经成为了国际研究的热点技术,许多IT行业的公司也都在研发相应的嵌入式网络终端。
电话是人们最常使用的交流工具,随着互联网的迅速发展,基于IP网络的语音通信成为了人们研究的热点。传统电话的语音传输质量和可靠性都很好,但资费较高,特别是打国际长途时;而基于IP网络的语音通信由于是在Internet上传输信号,大大节省了通信线路的成本,从而降低了VOIP资费,使其拥有了巨大的市场潜力。
目前,VOIP系统现有的终端软件,如Skype网络电话、UUCall网络电话、KC网络电话、Mierosoft公司的Netmeeting等,都是基于PC机的,难以运行在嵌入式网络终端这种资源有限的设备上。同时,许多类库中的函数在PC机上可以正常运行,而WinCE嵌入式操作系统却不支持,因此不能直接对VOIP系统现有的终端软件进行简单的裁剪。
1 嵌入式网络终端的硬件设计
1.1 系统硬件结构
如图1所示,系统由嵌入式网络终端、电源模块、以太网口模块、串口和USB接口模块、显示模块(触摸屏)、语音采集和播放模块、外部数据存储模块以及系统工作状态指示和接口模块构成。其中,嵌入式网络终端采用三星公司专门针对手持设备而设计的S3C2440A-40微处理器。
1.2 语音采集和播放模块
语音采集和播放模块的作用是将音频模拟信号转换为数字信号,并对信号进行PCM编码。其电路如图2所示。采用Philips公司的UDA1341 TS型立体声音频CODEC进行音频编解码。该芯片提供2个麦克风输入,可实现单端输入、差分输入等灵活配置,并设置了可编程增益放大器和自动增益控制器,可保证高质量的音频获取;同时,还集成了听筒和喇叭输出的驱动器,喇叭音量可以通过编程调整。S3C2440A-40微处理器与UDA1341TS编解码器通过I2S总线直接相连,并采用DMA发送/接收方式,完成系统的录音和放音。
1.3 嵌入式操作系统
嵌入式操作系统采用了微软公司研发的WinCE。它是一款功能强大的32位嵌入式实时操作系统,具有多线程、多任务、完全抢占式的特点,是专为各种受到严格资源限制的硬件系统所设计的。WinCE支持多种硬件外围设备,同时内置的标准通信能力使WinCE能够访问Internet并收发E-mail或浏览Web。除此之外,WinCE特有的与Windows类似的用户界面使最终用户易于使用。
2 VOIP技术
2.1 VOIP的基本原理
VOIP(Voice Over Internet Protocol)是以IP分组交换网络为传输平台,通过语音压缩算法对语音数据进行压缩编码处理,然后把这些语音数据按IP等相关协议进行打包,经过IP网络把数据包传输到接收地,再把这些语音数据包串起来,经过解码解压处理后恢复成原来的语音信号,从而达到由IP网络传送语音的目的。其特点是可以将一路语音数据压缩为8 kb/s甚至更低,同时可使用户不需要独占医疗线路资源,从而提高了线路利用率,并大大降低了资费成本。
2.2 VOIP协议
VOIP技术中最主要的两种呼叫控制协议为H.323协议和SIP协议。H.323是ITU的一个标准协议簇,制定了无服务质量保证的分组网络(PBN)上的多媒体通信系统标准,已在VOIP领域的到了广泛的应用,呼叫建立比较复杂。SIP协议是由IETF(国际互联网标准制定组织)制定的面向Internet会议和电话的信令协议,参照了HTTP和SMTP协议,呼叫控制在终端完成,呼叫建立相对简单。
2.3 语音压缩编码技术
语音压缩编码技术是VOIP技术的核心,其目的就是在保证语音音质和可懂的条件下,采用尽可能少的比特数来表示语音。常用的语音编码方式有G.723.1、G.729、G.729A等,其中G.729可将采样为64 kb/s的话音以几乎不失真的质量压缩至8kb/s。本设计采用了G.729方式的语音压缩算法,结合实时传输协议RTP和UDP网络传输技术来实现语音传输。
[!--empirenews.page--]
3 系统设计
3.1 终端软件的功能模块
终端软件功能模块如图3所示。此终端软件可为用户提供良好的交互界面。
3.2 VOIP终端软件主流程
用户打开终端软件,可以根据自己的需要选择语音聊天、文本聊天或者收发邮件。进行语音聊天前,用户可以直接在好友栏中选择聊天对象,也可直接输入对方的IP进行连接。语音聊天的过程是:说话方,麦克风采集模拟语音信号→语音芯片采集量化编码→嵌入式系统对信号进行压缩编码→RTP格式打包→UDP格式打包→IP格式打包→Internet网络传输;收听方,接收语音数据→去IP/UDP/RTP包头→嵌入式系统对信号解码→语音芯片将数字语音信号转为模拟信号→扬声器播放。
4 系统实现
4.1 语音采集和播放
语音信号的采集分为从网络上采集数据和从音频编解码器中获取数据。主要函数包括:语音采集函数VoiceCapture(),用线程控制语音采集函数Thread Voice Capture(),创建用于播放的音频设备对象函数Play Device(),创建音频捕捉设备对象函数Caputer Device(),创建音频捕捉缓冲区对象函数Capture Buffer(),创建辅助缓冲区函数Secondary Buffer(),音频格式设置函数Set Wave Format(),通知事件触发函数Notification(),停止语音采集函数Voice Stop(),从字节数组中获取音频数据并进行播放函数Get VoiceData()以及语音采集初始化函数Initialize Voiee()。
4.1.1 Get Voice Data()函数
具体流程如图4所示。从网络上获取的数据实际是由Local Socket.Begin Receive From()函数提取网络数据,再经接收数据函数转移给Get Voice Data()函数,Get Voice Data()函数提取后放入语音缓冲区供音频编解码器提取并播放。Get Voice Data()函数首先用支持存储区为内存的流Memory Stream从缓冲区读取数据byte Receive,将字节块写入当前流:
Memory Stream.Write(byte Receive,0,intReceive)
当流中存储的数据达到一定数据量时就播放语音:SecondaryBuffer.Write(0,Memory Stream,int Postion Write-in-tPostioPlay,LockFlag.From Write Cursor)Secondary Buffer.Play(0,Buffer Play Flags.Default)
4.1.2 采集音频编码器语音数据
从音频编解码器中获取数据时,首先通过UDA1341TS采集语音信号放入语音捕捉缓存区,应用程序再从语音捕捉缓冲获取语音信号并发送。具体程序流程如图5所示。
[!--empirenews.page--]
4.2 语音传输
语音传输是主要包含监听函数Listen(),数据发送函数SendVoice(),数据接收函数Receive Data(),绑定自己IP和端口函数BindSelf(),远程终端IP端口设置函数SetRemoteIPEnd()、线程关闭函数ThreadStop()函数和初始化函数InitVoice()。
4.2.1 监听函数
监听函数负责监听远程计算机发送到本机的信息。每隔一定时间查询一下网络,如果有可读的数据就接收:LocalSocket.BeginRecei-veFrom(byteData,0,byteData.Length,SocketFlags.None,ref endPoint,new AsyncCallback(ReceiveData),null)并且将此线程设置为后台线程,以便当主线程关闭时,此线程能自动结束。
4.2.2 数据发送函数
数据发送函数的作用是将语音捕捉缓冲区的数据通过Client.SendTo(CaptureData,EndPoint)函数发送到网络上。当线程发现有数据要读取(即线程被触发)时,就会循环调用数据发送函数,直到没有可读的数据为止。CaptureBuffer为语音捕捉缓冲区对象。数据发送流程如图6所示。
4.2.3 数据接收函数
数据接收函数的功能主要是调用GetVoiceData()函数从网络中接收语音数据并放入缓冲区。代码如下:
结语
以Internet为标志的嵌入式系统是嵌入式系统发展的第四阶段。本文在基于ARM+网卡芯片+UDA1341TS音频编解码芯片模式的硬件平台实现与网络资源的对接及语音采集和播放的基础上,开发了基于WinCE嵌入式操作系统的VOIP系统终端软件,实现了网络终端间的语音通信。