如何把指针所指的数据转成chr格式的?以便能通过NMUDP发出去(50分)

  • 主题发起人 主题发起人 八木
  • 开始时间 开始时间

八木

Unregistered / Unconfirmed
GUEST, unregistred user!
一个控件传递出一个指针(point)和长度(integer),看不出这个指针所指的数据类型,
我需要所指的数据通过NMUDP发出去,看帮助NMIDP只接受chr变量和integer长度。
 
PChar(p)^
注意小小的 ^ 号
 
谢谢,能再详细点么?我是初学。
假设一段数据是(Buffer : Pointer
Size: Integer);需要复制到SA字符串里去,由于
size长度我事先不知道,定义如下:
var
SA:array of char;
begin
setlength(SA,size);
下面再怎么写我就不会了:(
 
var
sa:PChar;
begin
getmem(sa,size);
move(PChar(Buffer)^,sa^,Size);
end;
 
我试了:
var
SA:PChar;
begin
getmem(sa,size);
move(PChar(Buffer)^,sa^,Size);
NMUDP1.SendBuffer(sa,size);
freemem(sa,size);
end;
但编译时通不过,显示:
[Error] Demo2Main.pas(63): Incompatible types: 'Array' and 'PChar'
 
NMUDP1.SendBuffer(sa^,size)
注意小小的 ^ 号
其实直接 NMUDP1.SendBuffer((PChar(Buffer)^,size)
就可以了
 
Pipi您说的方法已经编译通过,但程序还不正常,请您帮我看一下好么?
这个程序是语音采集、压缩,通过NMUDP发至本机,再解开放音,用了ACMIN、ACMOUT、
ACMConvertor三个控件。现在的情况是运行后听到的是一片噪音,我试过不通过NMUDP发送
直接播放正常。程序如下:
unit Demo2Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ACMIn, ACMOut, ACMConvertor, StdCtrls, NMUDP;
type
TfmMain = class(TForm)
ACMC: TACMConvertor;
ACMI: TACMIn;
Label1: TLabel;
NMUDP1: TNMUDP;
ACMC1: TACMConvertor;
ACMO1: TACMOut;
procedure FormCreate(Sender: TObject);
procedure ACMIBufferFull(Sender: TObject
Data: Pointer;
Size: Integer);
procedure NMUDP1DataReceived(Sender: TComponent
NumberBytes: Integer;
FromIP: String
Port: Integer);

private
{ Private declarations }
procedure TransmitData(Buffer : Pointer
Size : Integer);
public
{ Public declarations }
end;
var
fmMain: TfmMain;

implementation

{$R *.DFM}

procedure TfmMain.FormCreate(Sender: TObject);
begin
ACMC.InputBufferSize :=1024;
ACMI.BufferSize := ACMC.InputBufferSize;
ACMC.Active := True;
ACMI.Open(ACMC.FormatIn);

ACMO1.NumBuffers := 0;
ACMC1.Active :=true;
ACMO1.Open(ACMC1.Formatin);

NMUDP1.RemoteHost :='127.0.0.1';
NMUDP1.RemotePort :=7388;
NMUDP1.LocalPort :=7388;
end;

procedure TfmMain.ACMIBufferFull(Sender: TObject
Data: Pointer;
Size: Integer);
var
NewSize : Integer;
begin
Move(Data^,ACMC.BufferIn^,Size);
NewSize := ACMC.Convert;
TransmitData(ACMC.BufferOut,NewSize);
end;

procedure TfmMain.TransmitData(Buffer : Pointer
Size: Integer);
var
SA:pchar;
begin
getmem(sa,size);
NMUDP1.SendBuffer(PChar(sa)^,size);
freemem(sa,size);
end;

procedure TfmMain.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer
FromIP: String
Port: Integer);
var
SB:array[0..65535] of char;
begin
NMUDP1.ReadBuffer(sb,numberbytes);
ACMO1.Play(sb,numberbytes);
end;

end.
 
procedure TfmMain.TransmitData(Buffer : Pointer
Size: Integer);
不对啊sa都没拷贝数据

你可以直接用buffer,不需要经过sa:
procedure TfmMain.TransmitData(Buffer : Pointer
Size: Integer);
begin
NMUDP1.SendBuffer(PChar(Buffer)^,size);
end;
 
已经试过,还是一片噪音,中间有一点MIC传来的声音:(
 
ACMO1.Play的声明(函数原形)是怎么样的?
ACMC.BufferOut是什么数据类型?
 
ACMO1和ACMC都是从:http://www.delphi32.co.yu/preuzeti_tekstovi/internet_audio.htm
下载的(好象只能用IE下载),控件的PAS文件里有关部分是:
procedure TACMOut.Play(var Buffer
Size: Integer);
var
TempHeader : PWaveHdr;
Data : Pointer;
Res : Integer;
X : Integer;
procedure PlayHeader(Header : PWaveHDR);
begin
Res := WaveOutPrepareHeader(FWaveOutHandle,Header,SizeOf(TWaveHDR));
if Res <> 0 then RaiseException('WaveOut-PrepareHeader',Res);
Res := WaveOutWrite(FWaveOutHandle, Header, SizeOf(TWaveHDR));
if Res <> 0 then RaiseException('WaveOut-Write',Res);
end;
begin
if Size = 0 then exit;
if not active then exit;
TempHeader := NewHeader;
GetMem(Data, Size);
Move(Buffer,Data^,Size);
with TempHeader^ do begin
lpData := Data;
dwBufferLength := Size;
dwBytesRecorded := Size;
dwUser := 0;
dwFlags := 0;
dwLoops := 0;
end;
if FNumBuffersLeft > 0 then begin
FBackBufferList.Add(TempHeader);
Dec(FNumBuffersLeft);
end else begin
for X:=0 to FBackBufferList.Count-1 do
PlayHeader(PWaveHDR(FBackBufferList[X]));
FBackBufferList.Clear;
PlayHeader(TempHeader);
end;
end;
 
你纪录一下send出去多少字节,接收到多少字节吧
 
试了一下,显示发出和接收到的数据量是相等的。在向NMUDP发送前,在程序里加了下箭头所指的
那句,就可以收到正常的声音了,程序其它地方没变。
procedure TfmMain.ACMIBufferFull(Sender: TObject
Data: Pointer;
Size: Integer);
var
NewSize : Integer;
begin
Move(Data^,ACMC.BufferIn^,Size);
NewSize := ACMC.Convert;
ACMO1.Play(acmc.bufferout^, newSize)
//<-----------!!
//TransmitData(ACMC.BufferOut,NewSize);
end;
 
procedure TfmMain.TransmitData(Buffer : Pointer
Size: Integer);
var
SA:array of char;
begin
setLength(sa,size);
Move(Buffer^,SA[0],size);
NMUDP1.SendBuffer(sa[0],size);
end;
 
声音有些变化,但还是噪音。
 
那只好跟踪一下看两头的数据是否一样
 
问题已解决,可能是数据转换上出现的问题,把:
procedure TfmMain.TransmitData(Buffer : Pointer
Size: Integer);
var
SA:array of char;
begin
setLength(sa,size);
Move(Buffer^,SA[0],size);
NMUDP1.SendBuffer(sa[0],size);
end;
改为:
procedure TfmMain.TransmitData(Buffer : Pointer
Size: Integer);
var
data:array[1..65535] of char;
i:integer;
begin
for i:=1 to size do
data:=pchar(dword(buffer)+dword(i-1))^;
edit1.Text :=inttostr(size);
NMUDP1.SendBuffer(data,size);
end;
改后声音就正常了,感谢pipi的解答,分数太少,请笑纳。还有一奢求:能请pipi讲讲两者
程序的区别么?
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部