語音聊天程序實現(INDY, ACM, DELPHI)

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

聊天程序的設計、實現和介紹

 

 

 

 

 

 

                       

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                                            周寶峯

                                                西安交通大學軟件學院 MSE 2002

2005.01

 

 


 

                   

1.     程序設計... 3

2.     程序使用... 4

2.1 服務器的使用... 5

2.2 客戶端的使用... 5

3.     參考文獻... 6


 

 

1.   程序設計

程序設計環境:

採用Borland 公司 Delphi 7 企業版在Windows 2000 專業版上開發。

其他設計細節:

 

            TCP 服務器:

採用TIdTCPServer  <?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /> 實現.用於文本的交互.

對於每一個客戶端的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

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章