关于语音传输(100分)

  • 主题发起人 主题发起人 earthworm
  • 开始时间 开始时间
E

earthworm

Unregistered / Unconfirmed
GUEST, unregistred user!
用indy udp和acm做的
就是不出声,本来可以用indy的demo的,可我用的是Delphi 7,没有udpsock,真郁闷[:(]
IP填的是172.0.0.1,自己和自己讲话
可愣是啥声音都没有啊啊啊啊[:(!][:(!][:(!]
哪位大侠帮我看一下哪有问题吧
谢啦[:D]
unit Unit1;

interface

uses
Windows, SysUtils, Classes, Controls, Forms,
ACMWaveOut,mmsystem, ACMWaveIn, ACMDialog, StdCtrls,
Graphics, ExtCtrls, ComCtrls, Sockets, IdBaseComponent,
IdComponent, IdUDPBase, IdUDPServer,IdSocketHandle, IdUDPClient;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
IdUDPClient1: TIdUDPClient;
IdUDPServer1: TIdUDPServer;
ACMDialog1: TACMDialog;
ACMWaveOut1: TACMWaveOut;
ACMWaveIn1: TACMWaveIn;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ACMWaveIn1Data(data: Pointer;
size: Integer);
procedure IdUDPServer1UDPRead(Sender: TObject;
AData: TStream;
ABinding: TIdSocketHandle);
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var format:pointer;
begin

format:=ACMDialog1.OpenDialog;
if format=nil then
exit;
IdUDPServer1.Active:=true;
idudpclient1.Active:=true;
ACMWaveOut1.Open(format);
ACMWaveIn1.Open(format);
Button1.Enabled:=false;
Button2.Enabled:=true;
end;


procedure TForm1.Button2Click(Sender: TObject);
begin

ACMWaveIn1.Close;
ACMWaveOut1.Close;
IdUDPServer1.Active:=false;
idudpclient1.Active:=false;
Button1.Enabled:=true;
Button2.Enabled:=false;
end;


procedure TForm1.ACMWaveIn1Data(data: Pointer;
size: Integer);
var
mdata:array[1..400] of char;
k:integer;
begin

for k:=1 to sizedo
mdata[k]:=pchar(dword(data)+dword(k-1))^;
Idudpclient1.SendBuffer('172.0.0.1',5623,mdata,size);
end;


procedure TForm1.IdUDPServer1UDPRead(Sender: TObject;
AData: TStream;
ABinding: TIdSocketHandle);
var
DataStringStream: TStringStream;
begin

DataStringStream := TStringStream.Create('');
try
DataStringStream.CopyFrom(AData, AData.Size);
ACMWaveOut1.PlayBack(AData,AData.Size);
finally
DataStringStream.Free;
end;

end;

end.
 
我没有你那个控件,不过可以给你一些参考。
1、那个data你确定一定小于400字节。
2、使用PlayBack播放的数据是否需要音频头,你的那个数据是否有音频头,搞清了这些问题,你就应该可以做了,如果还不行,明天我给你个例子,今天太晚了,我得下了。
 
好的,谢谢![:D]
 
是 127.0.0.1
 
//你注意看我标记出来的语句,看看是不是这里出的问题。
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject;
AData: TStream;
ABinding: TIdSocketHandle);
var
DataStringStream: TStringStream;
begin

DataStringStream := TStringStream.Create('');
try
DataStringStream.CopyFrom(AData, AData.Size);
// ACMWaveOut1.PlayBack(AData,AData.Size);//你已经把AData的数据拷贝到DataStringStream,但是你还在使用AData,
ACMWaveOut1.PlayBack(DataStringStream,DataStringStream.Size);//修改成这样测试看看?

finally
DataStringStream.Free;
end;

end;

end.
 
各位大侠所说的问题都改了,可依然没有声音啊[:(]
我伤心啊
 
你对比过,udpserver接收的和你udpclent发出的一致的?
 
不好意思哦,我菜鸟一个,不知道如何对比呀
 
唉,单步运行跟踪一下看看。 否则怎么找问题啊。
 
我没法进入procedure TForm1.ACMWaveIn1Data(data: Pointer;
size: Integer);里面哦
我冲着话筒吼了很久...
 
我的经验。你先别忙通讯。
用个全局流。录的时后存入这个流。然后播放这个流。
如果有声音了。在通讯这个流(传递)。
否则你的录音有问题。
 
procedure TForm1.ACMWaveIn1Data(data: Pointer;
size: Integer);
begin

Idudpclient1.SendBuffer('172.0.0.1',5623,data^,size);
end;


procedure TForm1.IdUDPServer1UDPRead(Sender: TObject;
AData: TStream;
ABinding: TIdSocketHandle);
var
DataStringStream: tmemorystream;
begin

DataStringStream := tmemorystream.create;
try
DataStringStream.CopyFrom(AData, AData.Size);
DataStringStream.Seek(0,soFrombegin
ning);
ACMWaveOut1.Play(DataStringStream^,DataStringStream.size);
finally
DataStringStream.Free;
end;

end;
 
procedure TForm1.ACMWaveIn1Data(data: Pointer;
size: Integer);部分似乎没什么问题了,把声音存到缓冲里面后,playback一下的声音是正确
可不知这么的一直进不了procedure TForm1.IdUDPServer1UDPRead(Sender: TObject;
AData: TStream;ABinding: TIdSocketHandle);
ip填的就是127.0.0.1呀,我单步运行的时候,程序一直在ACMWaveIn1Data里循环,不知道为什么,哪位大侠指点一下下呵
 
怎么改.exe文件的图标啊?
 
改好了,呵呵
 
接受多人答案了
 
后退
顶部