;DELPHI制作录音话筒示意图怎样实现? 大家好:我现在在学习录音方面的知识,请教一个问题,怎样才能实现用一个简单的控件表示录音的时候话筒的音量?若有这方面的知识或代码请给点我帮助,非常感谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用TtrackBar都可以啊。不过你要找相关的API实现读音量和设置音量 给你个类http://hi.baidu.com/chinacharis/blog/item/76197c2826a12af999250a07.html自己学习吧 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. 这是我一年前写的。调用很简单就var FSoundCap : TSoundCap ;FSoundCap := TSoundCap.Create(handle);FSoundCap.Start;然后在一个定时器里取FSoundCap.MaxValue ;这个类写得不怎么好,没作修改,当时比较急用,所以也没怎么作优化 var FSoundCap : TSoundCap ; FSoundCap := TSoundCap.Create(handle); FSoundCap.StartCap;FSoundCap.OpenCapture(Handle);加个progressbar 然后在定时器里写上progressbar.position := FSoundCap.MaxValue ;停止:SoundCap.CloseCapture;另外,还需要将录音设备的输入源选择相应的才可以,比如有 CD 唱机 麦克风,线路输入,单声道输出,波形输出混音,立体声混合等等,各种声卡的都不一样,只有你选择了相应的输入源时才能使用相应的设备 求一个控件 急!大家请进 联入数据库 程序运行错误 找原因 delphi5中我设置了断点,怎么执行停不住啊? 如何形成曲线和读取曲线上的值 请问怎样在数据表中求某一字段的和? 请教Delphi中各种进制及字符间的相互转换 各位大虾请帮帮忙,怎样设置注册表让程序开机时自动运行! 逛珠江路的请 急急急!!!关于dephi MD5和base64加密问题 图片分割的问题 公司买软件,又不想换工作,不用Delphi 了,散分
自己学习吧
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.
var FSoundCap : TSoundCap ;
FSoundCap := TSoundCap.Create(handle);
FSoundCap.Start;
然后在一个定时器里取
FSoundCap.MaxValue ;
这个类写得不怎么好,没作修改,当时比较急用,所以也没怎么作优化
FSoundCap := TSoundCap.Create(handle);
FSoundCap.StartCap;
FSoundCap.OpenCapture(Handle);
加个progressbar 然后在定时器里写上
progressbar.position := FSoundCap.MaxValue ;
停止:
SoundCap.CloseCapture;
另外,还需要将录音设备的输入源选择相应的才可以,比如有 CD 唱机 麦克风,线路输入,单声道输出,波形输出混音,立体声混合等等,各种声卡的都不一样,只有你选择了相应的输入源时才能使用相应的设备