您的位置:首页 > 编程语言 > Delphi

语音聊天程序实现(INDY, ACM, DELPHI)

2005-01-20 11:25 507 查看


聊天程序的设计、实现和介绍

周宝峰
西安交通大学软件学院 MSE 2002
2005.01


1. 程序设计... 3
2. 程序使用... 4
2.1 服务器的使用... 5
2.2 客户端的使用... 5
3. 参考文献... 6

1. 程序设计

程序设计环境:
采用Borland 公司 Delphi 7 企业版在Windows 2000 专业版上开发。
其他设计细节:

TCP 服务器:
采用TIdTCPServer 实现.用于文本的交互.
对于每一个客户端的TCP连接,启动一个线程处理。结构图如下:

主线程
监听线程

Accept Client 1
Accept Client 1
Accept Client 1
Client1.Thread
Client2.Thread
Client3.Thread
线程管理用TIdThreadMgrDefault 管理。

UDP 服务器:
采用 INDY 中的TIdUDPServer 实现。当收到UDP包时,触发UDPRead 事件,在此进行声音数据的播放。

UDP客户端:
采用INDY 中的TIDUDPClient实现。当收集的声音数据超过缓冲区
大小(2048个字节)后,调用其SendBuffer方法将数据发出。

声音的提取:
采用TACMIN 控件收集声音,ACMIN控件主要也是调用Windows API waveInOpen 函数。函数声明:
function waveInOpen; external mmsyst name 'waveInOpen';
(MMSystem.pas)
声音编码:
默认采用GSM6.10 编码,详细编码支持情况:
GSM 6.10 8kHz, Mono – 默认
11.025kHz, Mono
22.050kHz, Mono
44.100 kHz, Mono
Micorsoft G.723.1 8 kHz Mono, 6400 bit/s
8 kHz Mono, 5333 bit/s

PCM 8/11/12/16/22/24/32/44/48 kHz, 8/16/Bit, Mono
MPET Layer –3
56/40/48/32/20/24/12/16/8 kBit/s, 24,000/22,000/16,000/8,000 Hz, Stereo
…..
声音输出:
当UDP服务器收到数据,使用ACMOut 播放。

AData.Read(AudioArray,AData.Size);

if not audioOut.Active then begin
with m_PlayAudioFormat.Format do begin
wFormatTag := 1;
nChannels := 1;
nSamplesPerSec := 22050;
nAvgBytesPerSec:= 22050;
nBlockAlign:=1;
wbitspersample := 8;
cbSize := SizeOf(TACMWaveFormat);
End;

//adioOut.Open(audioConvertor.FormatIn);
audioOut.Open(m_PlayAudioFormat);
end;

audioOut.Play(AudioArray, AData.Size);

2. 程序使用

注意:服务器程序和客户端程序不可运行在同一机器上(避免声音播放和收集冲突),一台机器只能同时运行一个服务器程序或者一个客户端程序。
服务器端的日志文件:CharSvr.log
客户端的日志文件:ClientError.log

2.1 服务器的使用

2.2 客户端的使用

选择在线的用户后方可发言。

3. 参考文献

[1] Indy in Depth Atozed Software
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: