开发一个delphi的实时语音对话的控件 本人是Delphi的初学者,现在需要开发一个delphi的实时语音对话的控件,无从下手,请各大虾援助啊!不胜感激! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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. 那这个是继承自哪个父类的呢?用的是TCP?为什么不用UDP呢? UDP也可以,你可以自己改,以上代码取自灰鸽子1.2代码,具体的你可以百度一下 关于软件显示的问题 请教mscomm32传输任何文件(用文件流读写) 在Quickrep里的QRDBtext如何将它自动换行呀?谢谢…… ADO数据集实时刷新问题?? 播放器的显波是怎么样实现的,能帖出代码最好。 菜鸟问题! 请问哪里有“浏览目录对话狂“控件下啊? 这100分相信大家可以轻松拿走!! 小弟要请教问题 各位大侠,有问题请教 选择sql 服务器 请指教关于DELPHI指针的使用问题。 dbgrid 小问题
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.