;DELPHI制作录音话筒示意图怎样实现?该如何处理
;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.