delphi制作wav文件的方法
本文實(shí)例講述了delphi制作wav文件的方法。分享給大家供大家參考。具體如下:
這里delphi用waveIn...函數(shù)制作wav文件
具體代碼如下:
//使用窗口接受音頻設(shè)備發(fā)出的消息:
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; {清除已錄制的內(nèi)容}
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: ; {此消息只攜帶了設(shè)備句柄}
MM_WIM_CLOSE: ; {此消息只攜帶了設(shè)備句柄}
MM_WIM_DATA: begin {此消息攜帶了設(shè)備句柄和 WaveHdr 指針(LParam)}
{保存錄制的數(shù)據(jù)}
ordLen := Length(SaveBuf);
SetLength(SaveBuf, ordLen + PWaveHdr(m.LParam).dwBytesRecorded);
CopyMemory(Ptr(DWORD(SaveBuf)+ordLen), PWaveHdr(m.LParam).lpData, PWaveHdr(m.LParam).dwBytesRecorded);
{繼續(xù)錄制}
waveInAddBuffer(hWaveIn, PWaveHdr(m.LParam), SizeOf(TWaveHdr));
end;
{處理播放消息}
MM_WOM_OPEN: ; {此消息只攜帶了設(shè)備句柄}
MM_WOM_CLOSE: ; {此消息只攜帶了設(shè)備句柄}
MM_WOM_DONE: begin {此消息攜帶了設(shè)備句柄和 WaveHdr 指針(LParam)}
waveOutUnprepareHeader(hWaveOut, PWaveHdr(m.LParam), SizeOf(TWaveHdr));
waveOutClose(hWaveOut);
end;
end;
end;
end.
希望本文所述對(duì)大家的Delphi程序設(shè)計(jì)有所幫助。
相關(guān)文章
Delphi實(shí)現(xiàn)樹型結(jié)構(gòu)具體實(shí)例
這篇文章介紹了Delphi實(shí)現(xiàn)樹型結(jié)構(gòu)具體實(shí)例,有需要的朋友可以參考一下2013-10-10
Delphi實(shí)現(xiàn)圖像文本旋轉(zhuǎn)特效完整實(shí)例代碼
這篇文章主要介紹了Delphi實(shí)現(xiàn)圖像文本旋轉(zhuǎn)特效完整實(shí)例代碼,對(duì)于幫助讀者進(jìn)一步理解Delphi圖形及文字特效的處理有一定的借鑒價(jià)值,需要的朋友可以參考下2014-07-07
Delphi用TActionList實(shí)現(xiàn)下載文件的方法
這篇文章主要介紹了Delphi用TActionList實(shí)現(xiàn)下載文件的方法,需要的朋友可以參考下2014-07-07
Delphi2007編譯的程序在Win7下圖標(biāo)模糊的解決辦法
這篇文章主要介紹了Delphi2007編譯的程序在Win7下圖標(biāo)模糊的解決辦法,需要的朋友可以參考下2014-08-08
解決delphi TAdoQuery組件的close方法導(dǎo)致”列名無(wú)效“錯(cuò)誤的問題
今天小編就為大家分享一篇解決delphi TAdoQuery組件的close方法導(dǎo)致”列名無(wú)效“錯(cuò)誤的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-02-02
delphi7連接mysql5的實(shí)現(xiàn)方法
這篇文章主要介紹了delphi7連接mysql5的實(shí)現(xiàn)方法,需要的朋友可以參考下2014-07-07

