首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

Delphi 录音有关问题,紧急

2012-03-05 
Delphi 录音问题,紧急!!!大家好,我正在编写一个Delphi程序,程序中要提供录音功能。有没有哪位前辈能够提供

Delphi 录音问题,紧急!!!
大家好,我正在编写一个Delphi程序,程序中要提供录音功能。

有没有哪位前辈能够提供一些关于录音的参考代码?

另外,最好是还能自动检测一下声音的大小,并返回给一个TProgessBar或是返回一个频谱,并且如果声音太小则进行提示。

有哪位高手能够办到么?教教我吧~!在线等啊!

[解决办法]
没试过这方面帮你顶一下........
[解决办法]
来自万一博客, 使用 TMediaPlayer 录制 wav 文件

http://www.cnblogs.com/del/archive/2009/11/10/1599835.html
[解决办法]
等着吧,帮你顶顶......
[解决办法]

探讨
来自万一博客, 使用 TMediaPlayer 录制 wav 文件

http://www.cnblogs.com/del/archive/2009/11/10/1599835.html

[解决办法]
学习...
[解决办法]
你想监控声音大小就不要用控件,只能自己用wave这系列函数或directsound 来编程才可边录边取声音数据, 要调节声音的小可以用mixer相关的函数。
检测声音大小要根据你的录音编码是多少位,根据录音数据查看每位的数值,就可知道声音大小了
12楼就是用wave 函数来录音的


procedure TForm3.Meter_vu; //录音函数var
i: integer;
WaveHdr: PWaveHdr;
DaBuffer: PArrayBuf;
iError : integer;
begin
WaveFormat.wFormatTag := WAVE_FORMAT_PCM;
WaveFormat.nChannels := 1; //MONO
WaveFormat.nSamplesPerSec := 8000; //采样为8k,44100
WaveFormat.nAvgBytesPerSec := 8000;
WaveFormat.nBlockAlign := 1;
WaveFormat.wBitsPerSample := 8; //声音编码数据大小 
 iError := WaveInOpen(@hWaveIn, 0, @WaveFormat, handle, 0, CALLBACK_WINDOW); //回调 if iError <> 0 then
begin
ShowMessage('err WaveInOpen');
Exit;
end;
//多缓冲录音,不用这么多,2个就可以了/color]
//创建8个buffer
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;

iError := WaveInPrepareHeader(hWaveIn, WaveHdr, sizeOf(TWaveHdr));
if iError <> 0 then
begin
ShowMessage('Error WaveInPrepareHeader! ');
Exit;
end;
iError := WaveInAddBuffer(hWaveIn, WaveHdr, Sizeof(TWaveHdr));
if iError <> 0 then
begin
ShowMessage('Error WaveInAddBuffer! ');
Exit;
end;
end;

iError := WaveInStart(hWaveIn);
if (iError <> 0) then
begin
ShowMessage('Error , WaveInStart');
end;
end;


[color=#FF0000]//声音的回调 ,当录音的缓冲满了会调用

procedure TForm3.WNDPROC(var msg: TMessage);
var
Hdr: PWaveHdr;
i: integer;
r: real;
tt: Integer;
vVal , vVal_temp: Integer;
begin
inherited;
case msg.Msg of
MM_WIM_DATA:
begin
vVal := 0;
Hdr := PWaveHdr(msg.LParam);

//根据声音数据 画图
if hdr^.dwBytesRecorded > 0 then
begin
r := Image1.ClientWidth / hdr^.dwBytesRecorded;
end
else
r := 0;
PatBlt(Image1.Canvas.Handle, 0, 0, Image1.ClientWidth, Image1.ClientHeight, BLACKNESS);
with Image1 do
begin
Canvas.Pen.Color := clRed;
Canvas.MoveTo(0, 127);
Canvas.LineTo(ClientWidth, 127);
Canvas.Pen.Color := clMaroon;
Canvas.MoveTo(round(r * 100), 0);
Canvas.LineTo(round(r * 100), 255);
Canvas.MoveTo(round(r * 200), 0);
Canvas.LineTo(round(r * 200), 255);
Canvas.MoveTo(round(r * 300), 0);


Canvas.LineTo(round(r * 300), 255);
Canvas.MoveTo(round(r * 400), 0);
Canvas.LineTo(round(r * 400), 255);
Canvas.MoveTo(round(r * 500), 0);
Canvas.LineTo(round(r * 500), 255);
Canvas.MoveTo(round(r * 600), 0);
Canvas.LineTo(round(r * 600), 255);
Canvas.MoveTo(round(r * 700), 0);
Canvas.LineTo(round(r * 700), 255);
Canvas.MoveTo(round(r * 800), 0);
Canvas.LineTo(round(r * 800), 255);
Canvas.MoveTo(round(r * 900), 0);
Canvas.LineTo(round(r * 900), 255);
Canvas.MoveTo(round(r * 1000), 0);
Canvas.LineTo(round(r * 1000), 255);
Canvas.MoveTo(round(r * 1100), 0);
Canvas.LineTo(round(r * 1100), 255);
Canvas.MoveTo(round(r * 1200), 0);
Canvas.LineTo(round(r * 1200), 255);

Canvas.Pen.Color := clLime;
Canvas.MoveTo(0, PArrayBuf(hdr.lpData)^[0]);

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

//取样本中的峰值峰值,实际上取样本一个点也可
vVal_temp := PArrayBuf(hdr.lpData)^[i];
if vVal_temp > vVal then
vVal := vVal_temp;
end;
end;

//采用八位采集样本最大分贝是48dB
try

//取样本数据一个点也可,在8位声道[0]中表示左声道
vVal := PArrayBuf(hdr.lpData)^[0];
vVal := vVal - 127; //取振幅正值
if vVal < 0 then
vVal := abs(vVal);
if vVal = 0 then
vVal := 1;

//这是按db来处理的
tt := round(100/48 * (20 * log10(vVal / 256) + 48 ));
ProgressBar1.Position := tt;

//右声道
vVal := PArrayBuf(hdr.lpData)^[1];
Dec(vVal, 127);
vVal := abs(vVal);
if vVal = 0 then vVal := 1;
tt := round(100 /48 * (20 * log10(vVal / 256) + 48 ));
ProgressBar2.Position := tt;
except
end;

WaveInUnprepareHeader(hWaveIn, hdr, Sizeof(TWaveHdr));

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

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

WaveInPrepareHeader(hWaveIn, Hdr, Sizeof(TWaveHdr));
WaveInAddBuffer(hWaveIn, Hdr, Sizeof(TWaveHdr));
end;
end;


end;



[解决办法]
你的那段代码,
WaveFormat.nChannels := 1; //单声道
WaveFormat.nSamplesPerSec := 8000; //采样为8khz
WaveFormat.nAvgBytesPerSec := 8000;
WaveFormat.nBlockAlign := 1;
WaveFormat.wBitsPerSample := 8; //8位
至于那段代码就是画波形。
[解决办法]
这个WaveFormat格式好像WAVE_FORMAT_PCM格式,PCM格式可能有限制,不能乱调整,你可以尝试调整,看程序会不会报错。
至于那段画波形代码,只是根据数据画点画线而已,没必要深入吧。

热点排行