读书人

;DELPHI制作录音话筒示意图怎样实现?

发布时间: 2012-02-05 12:07:15 作者: rapoo

;DELPHI制作录音话筒示意图怎样实现?
大家好:我现在在学习录音方面的知识,请教一个问题,怎样才能实现用一个简单的控件表示录音的时候话筒的音量?若有这方面的知识或代码请给点我帮助,非常感谢。

[解决办法]

Delphi(Pascal) code
unit SoundCap; interface uses     Windows, Messages, MMSystem, Classes, SysUtils, Math, Forms,Dialogs, Controls,ExtCtrls; type   TData8 = array [0..127] of byte;   PData8 = ^TData8;   TData16 = array [0..127] of smallint;   PData16 = ^TData16;     TSoundCap = Class(TCustomControl)   private   protected   public     FilterValve : Integer; //音频过滤的阀值     isCapture : boolean ;     MaxValue :integer;     constructor Create(handle : THandle); //overload;     destructor Destroy; override;     procedure OpenCapture(handle : THandle);     procedure CloseCapture;     procedure OnWaveIn(var Msg: TMessage); message MM_WIM_DATA;  //录音缓冲区满后,进行数据处理,将数据送到播放缓冲区     procedure StartCap;     procedure StopCap;   end; implementation var   WaveIn: hWaveIn;   hBuf: THandle;   BufHead: TWaveHdr;   bufsize: integer;   Bits16: boolean;   stop: boolean = false;   StartTime : DWORD ;   Count : integer = 0;   header: TWaveFormatEx; { TSoundCap } //关闭音频捕捉 procedure TSoundCap.CloseCapture; begin   if stop = false then     Exit;   stop := false;   while not stop do   Application.ProcessMessages;   stop := false;   WaveInReset(WaveIn);  // 停止声音输入设备工作   WaveInUnPrepareHeader(WaveIn, addr(BufHead), sizeof(BufHead));   WaveInClose(WaveIn);  //停止声音输入   GlobalUnlock(hBuf);   GlobalFree(hBuf); end; constructor TSoundCap.Create(handle: THandle); begin   Inherited Create(nil);   ParentWindow := handle;   isCapture := false;   FilterValve := 3; end; destructor TSoundCap.Destroy; begin   inherited;   CloseCapture; end; //处理Wave数据采集 procedure TSoundCap.OnWaveIn(var Msg: TMessage);  //缓冲区数据已满则处理消息 var   data8 : PData8;   i, x, y : integer;   StartPos, EndPos, SCount : integer;   tmp : Integer; begin   MaxValue := 0;   Data8 := PData8(PWaveHdr(Msg.lParam)^.lpData);   for i := 0 to BufSize - 1 do   Begin     x := i;     y := Round(abs(data8^[i] - 128) * 100 / 128); //data8^[i] 为 128 - 256 之间     tmp := Round(abs(data8^[i] - 128) * 100 / 128);     if tmp > MaxValue Then       MaxValue := tmp;   End;   if MaxValue = 1 then     MaxValue := 0;   Data8 := nil;   if stop then     WaveInAddBuffer(WaveIn, PWaveHdr(Msg.lParam),SizeOf(TWaveHdr))   else     stop := true; end; //打开音频捕捉 procedure TSoundCap.OpenCapture(handle: THandle); var   BufLen: word;   buf: pointer; begin   BufSize := 3 * 500 + 100;   Bits16 := false;   with header do   begin     wFormatTag := WAVE_FORMAT_PCM;     nChannels := 1;     nSamplesPerSec :=44100;// 22050;     wBitsPerSample := integer(Bits16) * 8 + 8;     nBlockAlign := nChannels * (wBitsPerSample div 8 );     nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;     cbSize := 0;   end;   WaveInOpen(Addr(WaveIn), WAVE_MAPPER, addr(header),self.Handle , 0, CALLBACK_WINDOW);   BufLen := header.nBlockAlign * BufSize;   hBuf := GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, BufLen); //从全局内存堆中分配一块内存(该内存可移动并且可供应用程序共享),并返回该内存块的句柄   Buf := GlobalLock(hBuf);                    //锁定全局内存并返回指向该内存块的指针   with BufHead do   begin     lpData := Buf;     dwBufferLength := BufLen;     dwFlags := WHDR_BEGINLOOP;   end;   WaveInPrepareHeader(WaveIn, Addr(BufHead), sizeof(BufHead)); //预备声音输入缓冲区   WaveInAddBuffer(WaveIn, addr(BufHead), sizeof(BufHead));    //向声音输入设备发送缓冲区   stop := true;                                                // 停止声音输入设备工作   WaveInStart(WaveIn); end; //开始监视捕捉 procedure TSoundCap.StartCap; begin   isCapture := true;   StartTime := GetTickCount; end; //停止监视音频捕捉 procedure TSoundCap.StopCap; begin   isCapture := false; end; end. 

读书人网 >.NET

热点推荐