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

来源:互联网 发布:js图片自动轮播代码 编辑:程序博客网 时间:2024/05/05 22:40

 

 

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

 

 

 

 

 

 

                       

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                                            周宝峰

                                                西安交通大学软件学院 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