通信网络-局域网多点语音通信系统的实现

  • 格式:pdf
  • 大小:334.72 KB
  • 文档页数:5

局域网多点语音通信系统的实现

唐晓东1 徐洪梅1 熊建设1 邵敏2

1(中国海洋大学电子工程系 山东青岛 266071)

2 (青岛科技大学信息学院 山东青岛 266061)

txd1981@sina.com.cn

摘要:目前在因特网上实现音频传输的效果还不是很理想,而局域网却足以传输高质量的音

频数据。我们利用Visual C++设计了一个能够应用于局域网的多点语音实时通信系统。该系

统包括语音采集、压缩编码、网络传输等主要模块。试验结果表明,本系统在局域网中传输

稳定、通信可靠,能够完成语音实时通信,有着潜在的应用价值。

关键词:语音通信 UDP 套接字 多播

中图分类号 TP393

Realization of a Multi-point Audio Communication System for LAN

Tang Xiaodong1 Xu Hongmei1 Xiong Jianshe1 Shao Min2

1(Electronic Engineering Department,Ocean University of China,Qingdao 266071)

2(Information Science and Technology Institute,Qingdao University of Science and

Technology,Qingdao 266061)

Abstract:At the present time INTERNET is not good at audio data transmission.LAN can transmit

audio data very well because of its enough bandwidth.We design a real-time speech communication

system applied in LAN with Visual C++.The modules of sampling,compression,transmission and so

on are included in this system.The computer simulation result indicates that the rea1-time

communication can be performed stable and reliable in this system and the system has the potential

value for LAN application.

Key words:audio communication,UDP,socket,multicast

1引言

目前,双机语音通信系统的实现已不是难题,但网络的互连要求我们能够实现多机的

语音通信。若采用广播方式实现多点通信,容易引起网络的阻塞,且不能使位于不同网段的

计算机收到广播消息,因此目前更通用的方式是采用多播。多播(也称多址广播或组播)技

术,是一种让数据从一个成员送出,然后复制给其他多个成员的技术。采用这种技术,可有

效地减轻网络通信的负担,避免资源的浪费。目前,IP多播技术被广泛应用在网络音频/视

频广播、AOD/VOD、网络视频会议、多媒体远程教育等方面。

我们基于UDP协议搭建了多点语音全双工通信系统。通过建立一个多播讨论组,并用UDP

包发送数据到该组的所有成员,同时接收该组其他成员的多播数据,实现了多机间语音通信。

2 实时语音通信系统的设计与实现

2.1 系统架构

图1为局域网多点语音实时通信的系统框图,主要包括数据的实时采集、压缩编码、

网络传输、语音解码、存储和播放等功能模块。

图1 语音实时通信系统框图

2.2 语音的数据采集和播放

声音的采集和播放都是通过操作WAVEHDR这个音频数据块结构来实现的,主要用到

的就是第一个成员变量lpData,它是一个指向音频数据缓冲区的指针。我们在分配缓冲区(内

存)的同时相应分配WAVEHDR数据块结构,然后将缓冲区的指针赋给lpData,这样当一

个缓冲区填满后,通过消息机制就可以调用消息处理函数进行处理和播放,播放完后又可通

过waveInAddBuffer()函数把缓冲区再送给音频设备输入驱动程序,继续进行采集并播放。

程序中为录入的语音数据设置了2个缓冲区,通过缓冲区指针的递增来循环使用各个缓冲

区。

录音开始后,每当有采样数据添满数据块后,设备驱动程序就会发消息MM_WIM_DATA给

用户窗口,相应的消息处理函数对数据块中的采样数据进行处理,然后发送给接收方;当接

收端一个音频数据块播放完毕,设备驱动程序又会发出消息MM_WOM_DONE,相应的消息处理

函数会将数据内存释放,以备接收后续数据。这样,为输入设备准备的音频数据块就在消息

的控制下循环使用,无需人为控制,实现了实时采集、处理和播放。当结束通话时要关闭音

频输入设备,这时音频设备驱动程序会发送MM_WIM_CLOSE消息,可在相应的消息处理函数中

清除赋给输入、输出设备的音频数据块。

2.3 语音的压缩编码

音频的编码方式有许多种,如基于ITU-T G.711语音编码协议的PCM(Pulse Code

Modulation ,脉冲编码调制)编码、基于ITU-T G.728语音编码协议的LD-CELP(低时延码

激励线性预测编码)以及我们熟悉的GSM数字蜂窝移动电话的语音编码标准等等。这些不同

的编码方式有着不同的数据压缩比和还原音质,具体的编码格式和算法更是大相径庭,多数

协议都比较复杂,普通程序难以实现其加、解压算法。而为多媒体提供了较强支持的Windows

操作系统引入了ACM和VCM技术,用来管理系统中存在的所有的音频和视频编/解码器

(Coder/Decoder,即CODECs)。通过它们提供的编程接口调用系统中存在的现成的编解码

器,可以实现音频数据的加、解压。Windows系统自带的音频CODECs 支持一些早期的音频数

据压缩标准,如ADPCM (Adaptive Differential Pulse Code Modulation,自适应差分脉冲

音频数据采集(压缩)

连接发送端

发送数据请求

接收确认信息 接收数据请求

发送组播地址和

端口号 监听数据请求

向组播组发送数

据 接收组播数据 启动接收播放音频数据线程

音频数据播放(解压) 建立组播套接字,加入组播组

IP组播网 建立连接

数据请求

IP组播地址和端口 接收端 发送端 编码调制)、GSM6.10编码等。

本系统语音的压缩编码采用WINDOWS本身附带的 TrueSpeech CODEC。当源信号为8K采

样、8bits PCM编码的WAVE音频信号时,它能实现大约10:1的压缩,这样高的压缩率还是比

较令人满意的。

2.4 语音的网络传输

(1)传输方式的选择

在TCP/IP分层模型中,传输层建立在IP层上,包含两种传输协议:传输控制协议TCP

和用户数据报协议UDP。TCP是面向连接的传输协议,在传输数据前,必须在发送方和接收

方直接先建立通信通道,它拥有重传机制和拥塞控制机制,提供高可靠性的服务。而UDP

是无连接的数据报传输,它不需要建立连接和撤销连接,而直接把数据送到接收端,并且还

取消了重发校验机制,能够达到较高的通信速率。所以UDP一般应用于对传输实时性要求较

高且网络可靠性较好的场合,如实时的语音图像传输。因此本系统中采用的是UDP协议。

(2)发送和接收线程

本程序在每个节点分别建立一个发送线程和接收线程,每个线程又建立一个套接字,即

一个客户端和一个服务器端套接字(可以理解为一个发送套接字和一个接收套接字)。服务

器端套接字向所有与其建立连接的节点发送音频数据,而客户端套接字可以主动向其他节点

建立连接,接收与其建立连接的节点的服务器端发送的数据。通过使用双套接字,可以实现

语音的多点双向通信。

客户机先向服务器发送一个数据包,用来通知服务器端本次要发送的字节数。随后利用

发送指针的递增循环,使用4个发送数据模块发送数据(每个发送数据模块实际上是我们分

配的内存缓冲区数组)。在服务器端,先根据最初接收的数据包确定接收的字节数,然后开

辟相同大小的内存,并根据接收指针的递增循环使用接收数据模块。结束传输后,双方调用

closesocket()函数关闭套接字。程序中为连接的套接字建立不同的读、写缓冲。

(3) 多播通信

多播的数据和控制层面分为两种,即“有根”和“无根”。有根数据流中,从数据根

发送的数据发往所有的叶节点,而叶节点发出的数据只能到达根节点,不会蔓延到其他节点。

而无根方式中,从任何节点发出的数据都会蔓延整个多播组,同时每个节点对于数据的发送

也没有任何限制,可以向任何组成员发送数据。

多播通信需要依赖一个特殊的地址组,名为“多播地址”,同时,这个组地址也用来

对一个指定的组进行命名。假设有4个主机都想通过IP多播,实现彼此间的通信,它们便

可加入同一个组地址。全部加入后,由一个节点发出的任何数据均会被复制一份,发给组内

的每个成员,甚至包括始发数据的那个节点。这是无根数据传播的特点。实现步骤如下:

①创建套接字。调用WSASocket()函数可以创建一个使用UDP协议的套接字,它是加入

多播组的初始化套接字,在函数中指定套接字使用的多播属性。

②绑定套接字。调用bind()函数绑定套接字,从而将创建好的套接字与本地地址和本

地端口联系起来。

③调用setsockopt()函数设置多播套接字的模式,设置适当的TTL,即生存时间。每

当多播路由器转发多播数据包时,数据包中的TTL值都会被减1,若数据包的TTL减少到0,

则路由器将抛弃该数据包。TTL的值是多少,多播数据便最多能经过多少个多播路由器。

④加入一个多播组。通过调用WSAJoinLeaf()函数可将套接字加入一个多播组并指定其

角色(发送者/接收者)。调用成功后会返回一个SOCKET多播套接字,注意,这个套接字不

是用来发送或接收数据,而是在你希望离开多播组的时候使用,调用closesocket()函数关

闭该套接字就离开了多播组。

⑤向多播组发送数据。调用WSAsendto() 函数,可在指定的UDP

套接字上向指定的多