如何取得麦克风的声音?并以波形实时显示

luhuaijun 2005-04-04 10:48:35

如何取得麦克风的声音?并以波形实时显示
...全文
807 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
newlife2005 2005-04-30
  • 打赏
  • 举报
回复
帮顶一下
luhuaijun 2005-04-09
  • 打赏
  • 举报
回复
ly_liuyang(Liu Yang) :
哈哈。。检测不到语音录入啊。。
我试了有点问题。
luhuaijun 2005-04-09
  • 打赏
  • 举报
回复
hanshujiang(一生中最爱) :这里是技术讨论区,请勿发商业用途的东西
ly_liuyang 2005-04-09
  • 打赏
  • 举报
回复
呵呵,我以前写过,可以的

主要代码:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Forms,
Dialogs, MMSystem, StdCtrls,Controls;

type
TArrayBuf = array[0..1023]of byte;//1 KByte
PArrayBuf = ^TArrayBuf;

TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
ComboBox3: TComboBox;
ComboBox4: TComboBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
WaveFormat:TWaveFormatEx;
WaveIn:PHWaveIn;
IsOn:boolean;

Procedure WNDPROC(var msg:TMessage);override;
Procedure InitWaveIn(IsInit:boolean);
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

Procedure Tform1.WNDPROC(var msg:TMessage);
var Hdr:PWaveHdr; i:integeR; r:real;
begin
INHERITED;
case msg.Msg of
MM_WIM_OPEN:
begin
Button1.Enabled:=false;
Button2.Enabled:=true;

Combobox2.Enabled:=false;
Combobox3.Enabled:=false;

Form2.Show;
end;
MM_WIM_CLOSE:
begin
Button1.Enabled:=true;
Button2.Enabled:=false;
Combobox2.Enabled:=true;
Combobox3.Enabled:=true;
Form2.Hide;
end;
MM_WIM_DATA:
if WaveIn<>nil then
begin
Hdr:=PWaveHdr(msg.LParam);
if hdr^.dwBytesRecorded>0
then r:=Form2.ClientWidth/hdr^.dwBytesRecorded
else r:=0;

PatBlt(Form2.Canvas.Handle,0,0,Form2.ClientWidth,form2.ClientHeight,BLACKNESS);//WHITENESS DSTINVERT DSTCOPY ...
(* oder form2.canvas.fillrect(Form2.canvas.cliprect); *)

Form2.Canvas.Pen.Color:=clRed;
Form2.Canvas.MoveTo(0,127);
Form2.Canvas.LineTo(Form2.ClientWidth,127);

//alle 100 bytes einen dunkelroten Strich
form2.Canvas.Pen.Color:=clMaroon;
Form2.Canvas.MoveTo(round(r*100),0);
Form2.Canvas.LineTo(round(r*100),255);
Form2.Canvas.MoveTo(round(r*200),0);
Form2.Canvas.LineTo(round(r*200),255);
Form2.Canvas.MoveTo(round(r*300),0);
Form2.Canvas.LineTo(round(r*300),255);
Form2.Canvas.MoveTo(round(r*400),0);
Form2.Canvas.LineTo(round(r*400),255);
Form2.Canvas.MoveTo(round(r*500),0);
Form2.Canvas.LineTo(round(r*500),255);
Form2.Canvas.MoveTo(round(r*600),0);
Form2.Canvas.LineTo(round(r*600),255);
Form2.Canvas.MoveTo(round(r*700),0);
Form2.Canvas.LineTo(round(r*700),255);
Form2.Canvas.MoveTo(round(r*800),0);
Form2.Canvas.LineTo(round(r*800),255);
Form2.Canvas.MoveTo(round(r*900),0);
Form2.Canvas.LineTo(round(r*900),255);
Form2.Canvas.MoveTo(round(r*1000),0);
Form2.Canvas.LineTo(round(r*1000),255);
Form2.Canvas.MoveTo(round(r*1100),0);
Form2.Canvas.LineTo(round(r*1100),255);
Form2.Canvas.MoveTo(round(r*1200),0);
Form2.Canvas.LineTo(round(r*1200),255);

Form2.Canvas.Pen.Color:=clLime;
Form2.Canvas.MoveTo(0,PArrayBuf(hdr.lpData)^[0]);
for i:=0 to hdr^.dwBytesRecorded-1 do Form2.Canvas.lineTo(round(r*i),PArrayBuf(hdr.lpData)^[i]);

WaveInUnprepareHeader(WaveIn^,hdr,Sizeof(TWaveHdr));

Dispose(Hdr.lpData);
DisPose(Hdr);

if isOn=false then EXIT;

Hdr:=new(PWaveHdr);
Hdr^.lpData:=pointer(new(PArrayBuf));
Hdr^.dwBufferLength:=1024;
Hdr^.dwBytesRecorded:=0;
Hdr^.dwUser:=0;
Hdr^.dwFlags:=0;
Hdr^.dwLoops:=0;

WaveInPrepareHeader(WaveIn^,Hdr,Sizeof(TWaveHdr));
WaveInAddBuffer(WaveIn^,Hdr,Sizeof(TWaveHdr));
end;
end;
end;

Procedure Tform1.InitWaveIn(IsInit:boolean);
var
i:integer;
WaveHdr:PWaveHdr;
DaBuffer:PArrayBuf;
openError,PrepareError,BufferAddError,StartError:integer;
begin
if IsInit then
begin
WaveFormat.wFormatTag:=WAVE_FORMAT_PCM;
WaveFormat.nChannels:=1; //MONO
WaveFormat.nSamplesPerSec:=strtoint(Combobox2.Text);
WaveFormat.nAvgBytesPerSec:=strtoint(Combobox2.Text);
WaveFormat.nBlockAlign:=strtoint(Combobox3.Text);
WaveFormat.wBitsPerSample:=8;

WaveIn:=new(PHWaveIn);
openError:=WaveInOpen(WaveIn,0,@WaveFormat,handle,0,CALLBACK_WINDOW);
for i:=1 to 8 do
begin
DaBuffer:=new(PArrayBuf);
WaveHdr:=new(PWaveHdr);
with WaveHdr^ do
begin
lpData:=pointer(DaBuffer);
dwBufferLength:=sizeof(DaBuffer);//1024 = 1 KByte
dwBytesRecorded:=0;
dwUser:=0;
dwFlags:=0;
dwLoops:=0;
end;
PrepareError:=WaveInPrepareHeader(WaveIn^,WaveHdr,sizeOf(TWaveHdr));
BufferAddError:=WaveInAddBuffer(WaveIn^,WaveHdr,Sizeof(TWaveHdr));//Schreibt die Header in die "zu Verarbeiten Liste"
end;
StartError:=WaveInStart(WaveIn^);//Startet das "Verarbeiten"

if (openError<>0)or(PrepareError<>0)or(BufferAddError<>0)or(StartError<>0)then
Showmessage(
'WaveInOpen :'+inttostr(openError)+#13+
'WaveInPrepareHeader :'+inttostr(PrepareError)+#13+
'WaveInAddBuffer :'+inttostr(BufferAddError)+#13+
'StartError :'+inttostr(StartError)+#13);
end else
begin
WaveInStop(WaveIn^);//Stop
if WaveIn<>nil then WaveInReset(WaveIn^);
if WaveIn<>nil then WaveInClose(WaveIn^);
Dispose(WaveIn);
WaveIn:=nil;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
IsOn:=true;
InitWaveIn(true);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
IsOn:=false;
InitWaveIn(false);
end;

http://lysoft.7u7.net
luhuaijun 2005-04-09
  • 打赏
  • 举报
回复
你总不上线。。
hanshujiang 2005-04-05
  • 打赏
  • 举报
回复
http://www.websamba.com/dxmylove,dxmylove@yahoo.com.cn,qq:171833017
我有,联系我
luhuaijun 2005-04-05
  • 打赏
  • 举报
回复
定。还是。。
怎么没有人回答啊。
study_df 2005-04-05
  • 打赏
  • 举报
回复
帮顶
Rex_love_Burger 2005-04-05
  • 打赏
  • 举报
回复
帮你顶!
aloking 2005-04-05
  • 打赏
  • 举报
回复
波形显示?是不是弄错了,你是不是想要的是winmap那种效果
小笨象 2005-04-04
  • 打赏
  • 举报
回复
顶一下。看看有没有结果。
Kshape 2005-04-04
  • 打赏
  • 举报
回复
帮顶

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧