delphi制造wav文件的辦法。本站提示廣大學習愛好者:(delphi制造wav文件的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是delphi制造wav文件的辦法正文
本文實例講述了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順序設計有所協助。