如何播放内存中的音频数据(Socket收到的)?(100分)

  • 主题发起人 主题发起人 ansili
  • 开始时间 开始时间
A

ansili

Unregistered / Unconfirmed
GUEST, unregistred user!
将Socket收到音频数据(Buffer)即时播放出来。
我现在的想法是不收到的Buffer压入队列中,然后在Pop出来播放。只要有数据就即时播放出来。现在问题的关键是不知道怎么播放内存中的数据?各位大师帮帮忙。
急!急!

qq : 69786714
 
给你的地址,讨论的挺多的!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=435721
 
soundplay使用内存方式读取
 
//----------------------------------------------
//接收到数据
//----------------------------------------------
procedure TForm1.UdpServerUDPRead(Sender: TObject;
AData: TStream;
ABinding: TIdSocketHandle);
var
rBuf:array of shortint ;
sBuf:array of shortint ;
//smallint
Header:PWaveHdr;
i : integer;
memblock : Pointer;
size : integer;
begin

//adpcm编码
{
size := adata.Size ;
setLength(rBuf,size);
setLength(sBuf,size);
Fstate.valprev := 0 ;
Fstate.index := 0 ;
adpcmdecoder(rbuf,sbuf,adata.size,Fstate);
}
//size := adata.Size ;
//showmessage(intTostr(size));
//G729编码
setLength(rBuf,60);
setLength(sBuf,960);
adata.ReadBuffer(rBuf[0],60);
DecodeAudioData(rbuf, 60, sbuf) ;

Header:=new(PWaveHdr);
memblock:=new(pointer);
getmem(memblock,960);
move(sbuf[0],memBlock^,960);
Header.lpdata:=memblock;
Header.dwbufferlength:=960;
Header.dwbytesrecorded:=960;
Header.dwUser:=0;
Header.dwflags:=0;
Header.dwloops:=0;
i:=WaveOutPrepareHeader(HWaveOut^,Header,sizeof(TWaveHdr));
if i<> 0 then

showmessage('WaveOutPrepareHeader error');
//播放声波数据
i:=WaveOutWrite(HWaveOut^,Header,sizeof(TWaveHdr));
if i<> 0 then

showmessage('WaveOutWrite error');

end;
 
用acm控件
 
多人接受答案了。
 
后退
顶部