delphi에서 wav 파일을 만드는 방법

4342 단어
본고의 실례는delphi가wav파일을 만드는 방법을 설명하였다.여러분에게 참고하도록 공유하다.구체적으로 다음과 같다.
여기 델파이가 웨이브인으로...함수 생성 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 프로그램 설계에 도움이 되었으면 합니다.

좋은 웹페이지 즐겨찾기