//接收并发送麦克风语音
procedure TcontForm.ACMWaveIn1Data(data: Pointer; size: Integer);
var pchData:pChar;
memStream:TMemoryStream;
begin
Try
pchData:=pchar(data);
If pchData[1]='' then Exit;
//---接受麦克风语音
memStream:=TMemoryStream.Create;
Try
memStream.Write(pchData^,size);
//idUDPClient1.BroadcastEnabled:=True;//用广播功能
//发送/接收buffer不够大引起的。用setsockopt将socket的send/recv的buffer加大
//因为UDP数据包有大小限制,这里如果超出部分,就没有传输,完全可以发几次发出去
If memStream.Size>idUDPClient1.BufferSize
then idUDPClient1.SendBuffer(memStream.Memory^,IdUDPClient1.BufferSize)
else idUDPClient1.SendBuffer(memStream.Memory^,memStream.Size);
hintBar1.Panels[1].Text:=IntToStr(IdUDPClient1.BufferSize)+'/'+IntToStr(memStream.Size);
Finally
memStream.Free;
End;
Except End;
end; //接收并播放语音
procedure TcontForm.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var recData:String;
pcharPlayStr:pchar;
myStream:TMemoryStream;
begin
//发送/接收buffer不够大引起的。用setsockopt将socket的send/recv的buffer加大
myStream:=TMemoryStream.create;
Try
myStream.LoadFromStream(AData);
Setlength(recdata,myStream.Size);
myStream.Position :=0;
myStream.Read(recdata[1],myStream.Size);//数据流转换成字符串
pcharPlayStr:=pchar(recData);
ACMWaveOut1.PlayBack(pcharPlayStr,AData.Size);//播放接收到的数据
Finally
myStream.Free;
End;
end;贴上源码,请各位大侠帮帮忙
procedure TcontForm.ACMWaveIn1Data(data: Pointer; size: Integer);
var pchData:pChar;
memStream:TMemoryStream;
begin
Try
pchData:=pchar(data);
If pchData[1]='' then Exit;
//---接受麦克风语音
memStream:=TMemoryStream.Create;
Try
memStream.Write(pchData^,size);
//idUDPClient1.BroadcastEnabled:=True;//用广播功能
//发送/接收buffer不够大引起的。用setsockopt将socket的send/recv的buffer加大
//因为UDP数据包有大小限制,这里如果超出部分,就没有传输,完全可以发几次发出去
If memStream.Size>idUDPClient1.BufferSize
then idUDPClient1.SendBuffer(memStream.Memory^,IdUDPClient1.BufferSize)
else idUDPClient1.SendBuffer(memStream.Memory^,memStream.Size);
hintBar1.Panels[1].Text:=IntToStr(IdUDPClient1.BufferSize)+'/'+IntToStr(memStream.Size);
Finally
memStream.Free;
End;
Except End;
end; //接收并播放语音
procedure TcontForm.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var recData:String;
pcharPlayStr:pchar;
myStream:TMemoryStream;
begin
//发送/接收buffer不够大引起的。用setsockopt将socket的send/recv的buffer加大
myStream:=TMemoryStream.create;
Try
myStream.LoadFromStream(AData);
Setlength(recdata,myStream.Size);
myStream.Position :=0;
myStream.Read(recdata[1],myStream.Size);//数据流转换成字符串
pcharPlayStr:=pchar(recData);
ACMWaveOut1.PlayBack(pcharPlayStr,AData.Size);//播放接收到的数据
Finally
myStream.Free;
End;
end;贴上源码,请各位大侠帮帮忙
1: acm 格式无采用什么格式好?
2:时延比较大,怎么解决?
3:噪音该怎么消除?
求高手赐教,或发到邮箱:[email protected]
谢谢