delphi制作wav文件的方法
本文实例讲述了delphi制作wav文件的方法。分享给大家供大家参考。具体如下:
这里delphi用waveIn...函数制作wav文件
具体代码如下:
//使用窗口接受音频设备发出的消息:
unitUnit1;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls;
type
TForm1=class(TForm)
Button1:TButton;
Button2:TButton;
Button3:TButton;
procedureFormCreate(Sender:TObject);
procedureButton1Click(Sender:TObject);
procedureButton2Click(Sender:TObject);
procedureButton3Click(Sender:TObject);
protected
procedureWndProc(varm:TMessage);override;
end;
var
Form1:TForm1;
implementation
{$R*.dfm}
usesMMSystem;
var
whIn1,whIn2,whOut:TWaveHdr;
hWaveIn,hWaveOut:HWAVE;
fmt:TWaveFormatEx;
buf1,buf2,SaveBuf:TBytes;
procedureTForm1.FormCreate(Sender:TObject);
begin
Button1.Caption:='开始录音';
Button2.Caption:='停止录音';
Button3.Caption:='播放录音';
end;
//开始录音
procedureTForm1.Button1Click(Sender:TObject);
begin
{指定要录制的格式}
fmt.wFormatTag:=WAVE_FORMAT_PCM;
fmt.nChannels:=2;
fmt.nSamplesPerSec:=22050;
fmt.nAvgBytesPerSec:=88200;
fmt.nBlockAlign:=4;
fmt.wBitsPerSample:=16;
fmt.cbSize:=0;
SaveBuf:=nil;{清除已录制的内容}
ifwaveInOpen(@hWaveIn,WAVE_MAPPER,@fmt,Handle,0,CALLBACK_WINDOW)=0then
begin
SetLength(buf1,1024*8);
SetLength(buf2,1024*8);
whIn1.lpData:=PAnsiChar(buf1);
whIn1.dwBufferLength:=Length(buf1);
whIn1.dwBytesRecorded:=0;
whIn1.dwUser:=0;
whIn1.dwFlags:=0;
whIn1.dwLoops:=0;
whIn1.lpNext:=nil;
whIn1.reserved:=0;
whIn2.lpData:=PAnsiChar(buf2);
whIn2.dwBufferLength:=Length(buf2);
whIn2.dwBytesRecorded:=0;
whIn2.dwUser:=0;
whIn2.dwFlags:=0;
whIn2.dwLoops:=0;
whIn2.lpNext:=nil;
whIn2.reserved:=0;
waveInPrepareHeader(hWaveIn,@whIn1,SizeOf(TWaveHdr));
waveInPrepareHeader(hWaveIn,@whIn2,SizeOf(TWaveHdr));
waveInAddBuffer(hWaveIn,@whIn1,SizeOf(TWaveHdr));
waveInAddBuffer(hWaveIn,@whIn2,SizeOf(TWaveHdr));
waveInStart(hWaveIn);
end;
end;
//停止录音
procedureTForm1.Button2Click(Sender:TObject);
begin
waveInStop(hWaveIn);
waveInUnprepareHeader(hWaveIn,@whIn1,SizeOf(TWaveHdr));
waveInUnprepareHeader(hWaveIn,@whIn2,SizeOf(TWaveHdr));
waveInClose(hWaveIn);
end;
//播放录音
procedureTForm1.Button3Click(Sender:TObject);
begin
whOut.lpData:=PAnsiChar(SaveBuf);
whOut.dwBufferLength:=Length(SaveBuf);
whOut.dwBytesRecorded:=0;
whOut.dwUser:=0;
whOut.dwFlags:=0;
whOut.dwLoops:=1;
whOut.lpNext:=nil;
whOut.reserved:=0;
waveOutOpen(@hWaveOut,WAVE_MAPPER,@fmt,Handle,0,CALLBACK_WINDOW);
waveOutPrepareHeader(hWaveOut,@whOut,SizeOf(TWaveHdr));
waveOutWrite(hWaveOut,@whOut,SizeOf(TWaveHdr));
end;
procedureTForm1.WndProc(varm:TMessage);
var
ordLen:Integer;
begin
inherited;
casem.Msgof
{处理录音消息}
MM_WIM_OPEN:;{此消息只携带了设备句柄}
MM_WIM_CLOSE:;{此消息只携带了设备句柄}
MM_WIM_DATA:begin{此消息携带了设备句柄和WaveHdr指针(LParam)}
{保存录制的数据}
ordLen:=Length(SaveBuf);
SetLength(SaveBuf,ordLen+PWaveHdr(m.LParam).dwBytesRecorded);
CopyMemory(Ptr(DWORD(SaveBuf)+ordLen),PWaveHdr(m.LParam).lpData,PWaveHdr(m.LParam).dwBytesRecorded);
{继续录制}
waveInAddBuffer(hWaveIn,PWaveHdr(m.LParam),SizeOf(TWaveHdr));
end;
{处理播放消息}
MM_WOM_OPEN:;{此消息只携带了设备句柄}
MM_WOM_CLOSE:;{此消息只携带了设备句柄}
MM_WOM_DONE:begin{此消息携带了设备句柄和WaveHdr指针(LParam)}
waveOutUnprepareHeader(hWaveOut,PWaveHdr(m.LParam),SizeOf(TWaveHdr));
waveOutClose(hWaveOut);
end;
end;
end;
end.
希望本文所述对大家的Delphi程序设计有所帮助。