delphi制作wav文件的方法
更新時(shí)間:2015年06月16日 09:37:50 作者:小卒過河
這篇文章主要介紹了delphi制作wav文件的方法,涉及Delphi操作多媒體文件的相關(guān)技巧,需要的朋友可以參考下
本文實(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)碰撞球體完整實(shí)例代碼
這篇文章主要介紹了Delphi實(shí)現(xiàn)碰撞球體完整實(shí)例代碼,通過該實(shí)例,讀者可以完整的了解一個(gè)Delphi項(xiàng)目的創(chuàng)建過程,加深對(duì)Delphi運(yùn)行原理的了解,需要的朋友可以參考下2014-07-07TImage組件實(shí)現(xiàn)保存圖片到Stream
這篇文章主要介紹了TImage組件實(shí)現(xiàn)保存圖片到Stream以及從stream中讀取圖片的方法,非常的實(shí)用,有需要的小伙伴可以參考下2016-05-05