用了deAudio控件+NMUDP做语音聊天软件,之前找了很多关于ACM控件的帖,大多数都说了逐渐出现延迟的问题,用了deAudio控件后,倒没发现多少延迟,同时也做了一个,但发现只能够在单机进行,如果放到另一台机...就只有先开程序的一方能够接到包,另一方就无法收包...请各位赐教。源程序放在http://kakyu.ys168.com的语音聊天程序文件夹里
deAudio2.8控件也放在那...

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, NMUDP, StdCtrls,deAudioIO,deACM;
    type
      TForm1 = class(TForm)
        NMUDP1: TNMUDP;
        de: TdeAudioIn;
        dc: TdeAudioConvertor;
        dc1: TdeAudioConvertor;
        da1: TdeAudioOut;
        procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
          FromIP: String; Port: Integer);
        procedure FormCreate(Sender: TObject);
        procedure dc1AudioConverted(Sender: TObject; AudioData: Pointer;
          AudioDataSize: Integer; var Abort: Boolean);
        procedure dcAudioConverted(Sender: TObject; AudioData: Pointer;
          AudioDataSize: Integer; var Abort: Boolean);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      PlayPackets:integer;
    implementation{$R *.dfm}procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
      NumberBytes: Integer; FromIP: String; Port: Integer);
    var
      mdata:array[1..22051] of char;
      data:Pchar;
    begin
     NMUDP1.ReadBuffer(mdata,NumberBytes);
     data:=pchar(dword(@mdata));
     caption:=inttostr(PlayPackets);
     inc(PlayPackets);
     dc.ConvertAudio(data,NumberBytes);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      de.Format.FormatToPCM(dc1.FormatIn);
      dc.FormatOut := da1.Format;
      de.BufferSize := de.Format.AvgBytesPerSec div 8 + 4;
      da1.Format.Assign(dc.FormatOut);
      dc.Activate;
      da1.Active := true;
      dc1.Activate;
      de.Active := true;
     NMUDP1.ReportLevel := Status_Basic;
     NMUDP1.LocalPort := 6668;
     NMUDP1.RemotePort := 6668;
    end;procedure TForm1.dc1AudioConverted(Sender: TObject; AudioData: Pointer;
      AudioDataSize: Integer; var Abort: Boolean);
    var
      mdata:array[1..22051] of char;
      i:integer;
    begin
     for i:=1 to AudioDataSize do mdata[i]:=pchar(dword(AudioData)+i-1)^;
       NMUDP1.SendBuffer(mdata,AudioDataSize);
    end;procedure TForm1.dcAudioConverted(Sender: TObject; AudioData: Pointer;
      AudioDataSize: Integer; var Abort: Boolean);
    begin
      da1.PlayAudio(audiodata,audiodatasize);
    end;end.代码如此
      

  2.   

    我的NetPhone
    http://soft.eastrise.net去看看~~