如何在录制声音的时候显示相应的音频曲线(300分)

  • 主题发起人 主题发起人 hklstore
  • 开始时间 开始时间
H

hklstore

Unregistered / Unconfirmed
GUEST, unregistred user!
目前有一个项目,需要录制声音的时候显示音频曲线,但是对这种东西实在是不了解,请问各位能否给一个解答,顺便说一句,不能使用控件。谢谢
 
别沉了,大家有没有办法呀
 
www.source520.com 站长必进 2万源代码电子经典书狂下载
 
分挺多呀。可惜下载的声音曲线代码找不到了。[?]
 
我这里有源代码和控件,如果需要可以联系我哦。QQ:272248270.邮箱:wenrui_2002@sina.com
 
可以参考:
//显示波形
procedure TForm1.ShowWav(Header:PWaveHdr);
var
i:integer;
r:real;
begin

//-----------------显示波形
if Header^.dwBytesRecorded>0 then

r:=form1.ClientWidth/Header^.dwBytesRecorded
else
r:=0;

PatBlt(form1.Canvas.Handle,0,0,form1.ClientWidth,form1.ClientHeight,BLACKNESS);//WHITENESS DSTINVERT DSTCOPY ...
(* oder form1.canvas.fillrect(form1.canvas.cliprect);
*)
form1.Canvas.Pen.Color:=clred;
form1.Canvas.MoveTo(0,127);
form1.Canvas.LineTo(form1.ClientWidth,127);
//alle 100 bytes einen dunkelroten Strich
form1.Canvas.Pen.Color:=clMaroon;
// form1.Canvas.Pen.Color:=clblue;
form1.Canvas.MoveTo(round(r*100),0);
form1.Canvas.LineTo(round(r*100),255);
form1.Canvas.MoveTo(round(r*200),0);
form1.Canvas.LineTo(round(r*200),255);
form1.Canvas.MoveTo(round(r*300),0);
form1.Canvas.LineTo(round(r*300),255);
form1.Canvas.MoveTo(round(r*400),0);
form1.Canvas.LineTo(round(r*400),255);
form1.Canvas.MoveTo(round(r*500),0);
form1.Canvas.LineTo(round(r*500),255);
form1.Canvas.MoveTo(round(r*600),0);
form1.Canvas.LineTo(round(r*600),255);
form1.Canvas.MoveTo(round(r*700),0);
form1.Canvas.LineTo(round(r*700),255);
form1.Canvas.MoveTo(round(r*800),0);
form1.Canvas.LineTo(round(r*800),255);
form1.Canvas.MoveTo(round(r*900),0);
form1.Canvas.LineTo(round(r*900),255);
form1.Canvas.MoveTo(round(r*1000),0);
form1.Canvas.LineTo(round(r*1000),255);
form1.Canvas.MoveTo(round(r*1100),0);
form1.Canvas.LineTo(round(r*1100),255);
form1.Canvas.MoveTo(round(r*1200),0);
form1.Canvas.LineTo(round(r*1200),255);
form1.Canvas.Pen.Color:=clLime;
// form1.Canvas.Pen.Color:=clblue;
form1.Canvas.MoveTo(0,PmemBlock(Header.lpData)^[0]);
for i:=0 to Header^.dwBytesRecorded-1do

form1.Canvas.lineTo(round(r*i),PmemBlock(Header.lpData)^);
//-----------------显示波形

end;
 
录音时的图形

//***********************************************************************//
// //
// 画局部音频数据的波形 //
// 参数: //
// Flag : 波形显示周期 //
// Buf : 音频数据 //
// Length : 音频数据的长度 //
// DesCanvas : 要显示波形的目标画布 //
// DH, DW : 目标画布的工作区域的高度与宽度 //
// DesBitMap : 画波形时用的非可视源位图对像 //
// DrawLineColor : 画波形的颜色 //
// DrawBackColor : 画波形的背景颜色 //
// Draw : 是否画波形 //
// 返回值: 无 //
// //
//***********************************************************************//
procedure DrawPartWave(const Flag: Integer;
Buf: PChar;
Length: LongInt;

DesCanvas: TCanvas;
DH, DW: SmallInt;
DesBitMap: TBitMap;

DrawLineColor, DrawBackColor: TColor;
Draw: Boolean = True);

var
i, j, k, lmax, lmin: LongInt;

Max, Min: LongInt;

X, Y: SmallInt;

begin

with DesBitMapdo
//初始化图像参数
begin

Width := DW;

Height := DH;

Canvas.Brush.Color := DrawBackColor;

Canvas.Brush.Style := bsSolid;

Canvas.Pen.Color := DrawLineColor;

Canvas.Pen.Mode := pmCopy;

Canvas.FillRect(Rect(0, 0, DW, DH));

end;



if ((Length = 0) Or (Buf = NIL)) then

begin
//清除
BitBlt(DesCanvas.Handle, 0, 0, DW, DH, DesBitMap.Canvas.Handle, 0, 0, SRCCOPY);

Exit;

end;


Max := -32768;

Min := 32767;

for i := 0 to (Length div 2 -1 )do
//取到最小值与最大值
begin

j := PCMInt(PChar(Buf) + i * 2)^;

if j > Max then
Max := j;

if j < Min then
Min := j;

end;


DrawMin := Min;

DrawMax := Max;


if Not Draw then

begin

Exit;

end;



Max := Max - Min;
//最大振幅
DesBitMap.Canvas.MoveTo(0, DH div 2);

j := 0;

X := 0;

lmax := 0;

lmin := 32767;

for i := 0 to ((Length) div 2 -1)do

begin

if j < (Flag - 1) then
//如果是在一个周期内
begin

INC(j);

end
else
begin

j := 0;

X := X + 1;

lmax := 0;

lmin := 32767;

end;


if Max <> 0 then
//取音频数据转换在整数
Y := Abs(PCMInt(PChar(buf) + i * 2)^ - Min) * DH div Max
else

Y := DH div 2;

k := 0;

if Y > lmax then

begin

lmax := Y;

k := 1;

end;


if Y < lmin then

begin

lmin := Y;

k := 1;

end;


if k = 1 then

DesBitMap.Canvas.LineTo(X, Y);
//画线
if X > DW then
break;

end;


//图像复制 拷贝
BitBlt(DesCanvas.Handle, 0, 0, DW, DH, DesBitMap.Canvas.Handle, 0, 0, SRCCOPY);

end;
 
多人接受答案了。
 
后退
顶部