本人是Delphi的初学者,现在需要开发一个delphi的实时语音对话的控件,无从下手,请各大虾援助啊!不胜感激!

解决方案 »

  1.   

    unit TACMWaveInUnit; interface uses 
      Windows,Classes, IdTCPClient,IdGlobal,ComCtrls,SysUtils,BASE64,MMSystem , 
      soundin,mixing,soundConverter,headers; 
    type 
      TACMWaveInThread = class(TThread) 
      private 
        SysThread:TIdTCPClient; 
        Acmin1: Tacmin; 
        procedure ACMIn1BufferFull(Sender: TObject; Data: Pointer; 
        Size: integer); 
      protected     procedure Execute; override; 
      Public 
        constructor Create; 
        destructor Destroy; override; 
      end; implementation 
    uses MainServer; 
    procedure TACMWaveInThread.ACMIn1BufferFull(Sender: TObject; Data: Pointer; 
      Size: integer); 
    var 
     mdata: array[1..512] of char; 
     k:integer; 
    begin 
    try 
       for k := 1 to size do 
          mdata[k] := pchar(dword(data) + k - 1)^; 
       SysThread.WriteBuffer(mdata,Sizeof(mdata)); 
    except 
    end; 
    end; constructor TACMWaveInThread.Create; 
    var 
      origformat: pWaveFormatEX; 
      s: array[1..256] of byte; 
      F: Tacmwaveformat; 
    begin 
       inherited Create(True);    SysThread:=TIdTCPClient.Create(nil); 
       SysThread.RecvBufferSize:=32768; 
       SysThread.SendBufferSize:=32768; 
       ACMIn1:= Tacmin.Create(nil);    acmin1.buffersize := 512; 
       acmin1.numbuffers := 4;    ACMIn1.onbufferfull:=ACMIn1BufferFull;    GetMem(OrigFormat, Sizeof(TACMWaveFormat));    with origformat^ do 
         begin 
           wformattag := 49;       // gsm 6.10 2kb 
           nchannels := 1; 
           nsamplespersec := 8000; 
           navgbytespersec := 1625; 
           nblockalign := 65; 
           wbitspersample := 0; 
           cbsize := 2; 
           move(origformat^, s, Sizeof(TACMWaveFormat)); 
           s[18] := 0; 
           s[19] := 64; 
           s[20] := 1; 
           move(s, f.format, sizeof(Tacmwaveformat)); 
         end; 
       freemem(origformat); 
       //Acmin1.BufferSize := trunc(f.Format.nAvgBytesPerSec / 20); 
       //if Acmin1.buffersize  <= f.format.nblockalign then 
       //Acmin1.BufferSize := f.format.nblockalign * 2; 
       //if Acmin1.buffersize > 1900 then acmin1.buffersize := 1900; 
       //if Acmin1.buffersize = 150 then acmin1.BufferSize := 150 + 65; 
       try 
          Acmin1.Open(f); 
       except 
          ACMIn1.Close; 
       end;    ACMWaveOver:=True;    FreeOnTerminate:=True; 
       Suspended := false; 
       //Priority:=tpIdle; 
    end; 
    procedure TACMWaveInThread.Execute; 
    var 
      Request:String; 
    begin 
       if H_GZVIP2004.ConRpcport(SysThread) then 
         begin 
           try 
             Request:='005'; 
             Request:=EncodeBase64(Request); 
             SysThread.Write(Request+EOL); 
           except 
             SysThread.Free; 
             Self.Terminate; 
             exit; 
           end; 
           try    //循环发送 
             repeat 
                Sleep(1); 
             until (Terminated) or (SysThread.Connected=False); 
           except 
           end; 
        end;     SysThread.Disconnect; 
        SysThread.Free; 
    //    Self.Terminate; 
    end; destructor TACMWaveInThread.Destroy; 
    begin 
      ACMWaveOver:=False; 
      inherited destroy; 
    end; 
    end.
      

  2.   

    那这个是继承自哪个父类的呢?用的是TCP?为什么不用UDP呢?
      

  3.   

    UDP也可以,你可以自己改,以上代码取自灰鸽子1.2代码,具体的你可以百度一下