我想编写一个程序,能通过局域网络实时把一台电脑的MIC 声音传到其他电脑,如何编写接收和发送程序
解决方案 »
- 怎么读取Powerbuilder的数据窗口列表中数据
- 一个比较容易的问题
- 求助:如何不用鼠标拖放的方式,直接在代码里使用一个TTimer组件
- 请问大家,有没有这样一种DBGrid呀???...............
- 我想请问一下: 各位在设计界面的时候,一般都采用“什么字体?”, “什么字号?”
- 烦死了,ImeName,ImeMode这两个厮太烦人了。
- 怎樣在Delphi中調用ActiveX控件(ocx)?
- 用什么函数可以删除字符串中所有的空字符
- CHM文件(HTML HELP)是怎么做出来的?
- 要在右键弹出菜单中添加新项目,该如何修改注册表啊?高手赐教!!!
- 求wav文件的格式转换的代码
- 简单的问:DBGrid的刷新问题?___在线等待
var
FileSize,i,Reclen,diff:Longint;
P:Pointer;
TempFile:Integer;
Str:Array [0..80] of Char;
begin
StopPlaying;
btnStop.Enabled := True;
Sel1 := 0;
Sel2 := 0;
ReallocMem(wavebuf,0);
Tracker.Position := 0;
Tracker.Max := 0;
ReallocMem(pfmt,0);
ReallocMem(pfmt,sizeof(pfmt^));
pfmt^.nChannels := 1;
pfmt^.nSamplesPerSec := 8000;
pfmt^.nAvgBytesPerSec := 16000;
pfmt^.wBitsPerSample := 16;
pfmt^.nBlockAlign := 2;
pfmt^.wFormatTag := 1;
pfmt^.cbSize := 0;
EditFileName :=SaveDialog.InitialDir+'NONAME.VOC';
TempFile := FileCreate(SaveDialog.InitialDir+'vtemp.lin');
Caption := '正在录音:['+EditFileName+']';
//---------------------------------------------------------------------
wavelen := 0;
//ReallocMem(P,160000);
wfx.wFormatTag:=WAVE_FORMAT_PCM;
wfx.nChannels := 1;
wfx.nSamplesPerSec := 8000;
wfx.nAvgBytesPerSec := 16000;
wfx.wBitsPerSample := 16;
wfx.nBlockAlign := 2;
wfx.cbSize := 0;
CheckError(waveInOpen(@hwi,WAVE_MAPPER,@wfx,0,0,CALLBACK_NULL)); ReallocMem(wavebuf,8000); wh.lpData:=wavebuf;
wh.dwBufferLength:=8000;
wh.dwFlags := 0; // must be 0
CheckError(waveInPrepareHeader(hwi,@wh,sizeof(TWAVEHDR))); CheckError(waveInAddBuffer(hwi,@wh,sizeof(TWAVEHDR))); CheckError(waveInStart(hwi));
Recording := True;
Modified := True;
FileSize := 0;
while((not btnStop.Down) And (Recording)) do
begin
Application.ProcessMessages;
if (wh.dwFlags and WHDR_DONE)<>0 then
begin
tm.wType:=TIME_BYTES;
CheckError(waveInGetPosition(hwi,@tm,sizeof(TMMTime)));
diff := longint(tm.cb)-FileSize;
wavelen := diff;
FileSize := longint(tm.cb);
Flag := (diff) div 2 div DrawBox.ClientWidth+1;
if Flag<=0 then Flag := 1;
DrawCurve(Flag,StartPos);
FileWrite(TempFile,wavebuf^,diff);
lblWaveLen.Caption := Format('%0.2f', [FileSize / 16000])+'秒';
CheckError(waveInAddBuffer(hwi,@wh,sizeof(TWAVEHDR)));
end;
end;
CheckError(waveInStop(hwi));
CheckError(waveInReset(hwi));
CheckError(waveInUnPrepareHeader(hwi,@wh,sizeof(TWAVEHDR)));
ReallocMem(wavebuf,0);
CheckError(waveInClose(hwi)); FileSeek(TempFile,0,0);
ReallocMem(wavebuf,FileSize);
FileRead(tempFile,wavebuf^,FileSize);
wavelen := FileSize;
Flag := wavelen div 2 div DrawBox.ClientWidth+1;
if Flag<=0 then Flag := 1;
DrawCurve(Flag,StartPos);
Recording := False;
FileClose(tempFile);
DeleteFile(SaveDialog.InitialDir+'vtemp.lin');这是一段录音的代码
调整 wh.dwBufferLength:=8000;
这是缓存区大小
减小缓存区大小
搞双缓冲可以提高实时性
大家一起学习一下吗!!![email protected]
[email protected] 3Q