基于vc++的语音聊天系统的实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于vc++的语音聊天系统的实现

摘要:语音通信在计算机网络应用中越来越普及。语音聊天方式一般有两种,一种是专门的语音聊天室,采用Web方式,B/S结构。另外一种则是采用C/S结构。本文简要论述了C/S模式下的网络语音聊天系统。

0 引言

随着计算机通信技术的迅速发展,网络聊天已经成为和电话一样重要的通信方式。网络语音聊天,与传统的文字聊天相比,更加具有亲和力。语音聊天方式一般有两种,一种是专门的语音聊天室,采用Web方式,B/S结构。另外一种则是采用C/S结构。本系统是采用的是后者。

1 相关理论与关键技术

1.1 通信模式及socket类

所谓C/S编程模式是基于可靠的连接的通信模式。在通信的双方必须使用各自的IP地址以及端口进行通信。通信的一方为服务器端,另一方为客户端。服务器端等待客户连接请求的到来,并响应客户端的连接请求。客户端与服务器端可以进行数据交换,直至交换完毕后客户端关闭与服务器端的连接。

网络通信程序通常用基于MFC类库中的Socket(套接字)进行编程的。通信双方均有各自的套接字,且该套接字与特定的IP地址和端口号相关联。

1.2 语音聊天的关键技术

语音聊天程序的设计思想是发送声音的一端将硬件接口采集到的声音数据通过Socket发送到另外一端,另外一端根据得到的声音数据调用硬件接口播放声音。其核心就是声音数据的采集、播放和声音数据的网络传输。

2 系统设计和整体构架

根据关键技术的分析,程序有如下几个模块:

⑴负责接收连接的服务器Socket模块:负责该程序作为服务器时的网络端口监听。⑵负责接收/发送数据的客户端Socket模块:负责对Socket的发送数据和接收数据进行消息处理。⑶声卡数据的采集和播放模块:采用相关波形音频API,负责采集声音数据和播放声音

数据。⑷主框架的参数设定、消息处理和界面控制模块:负责控制整个程序的操作,负责处理用户的输入参数,负责处理声卡消息和Socekt消息。

3 语音聊天的实现

3.1 服务器Socket模块的基本设计

⑴创建套接字(socket);⑵将套接字绑定到一个本地地址和端口上(bind);⑶调用serversocket(),创建一个监听的socket;⑷将套接字设为监听模式,准备接收客户请求(listen);⑸等待客户请求到来。当请求到来后,接受连接请求,返回一个新的对应于此次连接套接字(accept);⑹用返回的套接字和客户端进行通信(send/recv);⑺返回,等待另一客户请求;⑻关闭serversocket(),关闭socket();

3.2 客户端Socket模块的基本设计

⑴创建一个套接字(socket)⑵调用socket()创建一个会话的socket;⑶调用connect()建立与server端的连接;⑷和服务器端进行通信(s e n d / r e c v ); ⑸关闭s o c k e t();

3.3 声卡的采集和播放模块的实现

录音的的准备工作主要是4点:打开录音设备;获得录音句柄;指定录音格式;分配若干用于录音的内存。

模块的关键代码实现如下:

WA VEFORMA TEX waveformat;

waveformat.wFormTag=W A VE_FORMA T_PCM;// 标志各种波形格式

waveformat.nChannels=1;// 声道数

waveformat.nSamplesPerSec=8000;// 采样频率

waveformat.nAvgBytesPerSec=16000;// 每秒采样音频字节数

waveformat.nBlockAlign=2;//音频数据单元

waveformat.cbSize=0;// 压缩系数

waveformat.wBitsPerSample=16;//指定录音格式

//打开录音设备,采用窗口方式接收音频消息

intres=waveInOpen(&m_hWaveIn,WA VE_

MAPPER,&waveformat,(DWORD)m_hWnd,0L,CAL_LBACK_WINDOW);

//准备录音缓冲区

waveInPrepareHeader(m_hWaveIn,m_

pWaveHdr[i],sizeof(W A VEHDR));

//向音频输入设备传送一块缓冲区。当缓冲区被填满的时候,程序会得到系统通知waveInAddBuffer(m_hWaveIn,m_

pWaveHdr[i],sizeof(W A VEHDR));

//开始录音

waveInStart(m_hWaveIn);

//停止录音

waveInStop(m_hWaveIn);

//清空内存块

waveInReset(m_hWaveIn);

//关闭录音设备

waveClose(m_hWaveIn);

4 结论

相关文档
最新文档