首页 > 编程 > Delphi > 正文

delphi制作wav文件的方法

2020-01-31 20:50:28
字体:
来源:转载
供稿:网友

本文实例讲述了delphi制作wav文件的方法。分享给大家供大家参考。具体如下:

这里delphi用waveIn...函数制作wav文件

具体代码如下:

//使用窗口接受音频设备发出的消息:unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls; type  TForm1 = class(TForm)   Button1: TButton;   Button2: TButton;   Button3: TButton;   procedure FormCreate(Sender: TObject);   procedure Button1Click(Sender: TObject);   procedure Button2Click(Sender: TObject);   procedure Button3Click(Sender: TObject);  protected   procedure WndProc(var m: TMessage); override;  end; var  Form1: TForm1; implementation {$R *.dfm}  uses MMSystem; var  whIn1,whIn2, whOut: TWaveHdr;  hWaveIn,hWaveOut: HWAVE;  fmt: TWaveFormatEx;  buf1,buf2,SaveBuf: TBytes; procedure TForm1.FormCreate(Sender: TObject); begin  Button1.Caption := '开始录音';  Button2.Caption := '停止录音';  Button3.Caption := '播放录音'; end; //开始录音 procedure TForm1.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; {清除已录制的内容}  if waveInOpen(@hWaveIn, WAVE_MAPPER, @fmt, Handle, 0, CALLBACK_WINDOW) = 0 then  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; //停止录音 procedure TForm1.Button2Click(Sender: TObject); begin  waveInStop(hWaveIn);  waveInUnprepareHeader(hWaveIn, @whIn1, SizeOf(TWaveHdr));  waveInUnprepareHeader(hWaveIn, @whIn2, SizeOf(TWaveHdr));  waveInClose(hWaveIn); end; //播放录音 procedure TForm1.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; procedure TForm1.WndProc(var m: TMessage); var  ordLen: Integer; begin  inherited;  case m.Msg of   {处理录音消息}   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程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选