Пример в этой статье описывает, как создавать файлы WAV в Delphi. Поделитесь этим со всеми для справки. Подробности следующие:
Здесь Delphi использует функцию waveIn... для создания wav-файлов.
Конкретный код выглядит следующим образом:
//Используем окно для приема сообщений от аудиоустройства: unit Unit1; интерфейс использует Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton2; : TButton ; Button3: TButton; процедура FormCreate (Отправитель: TObject); процедура Button1Click (Отправитель: процедура TObject); Button2Click(Sender: TObject); процедура Button3Click(Sender: TObject); защищенная процедура WndProc(var m: TMessage; end; var Form1: TForm1; реализация {$R *.dfm} использует MMSystem; whOut: TWaveHdr; hWaveIn, hWaveOut: HWAVE FMT: TWaveFormatEx; buf1,buf2,SaveBuf: TBytes; ; //Начало процедуры записи TForm1.Button1Click(Sender: TObject Begin {Укажите формат записи}); fmt.wFormatTag: = WAVE_FORMAT_PCM; fmt.nChannels: = 2; fmt.nSamplesPerSec: = 22050; fmt.nAvgBytesPerSec: = 88200; fmt.nBlockAlign: = 4; mt.cbSize: = 0; SaveBuf := nil; {Очистить записанное содержимое} if waveInOpen(@hWaveIn, WAVE_MAPPER, @fmt, Handle, 0, CALLBACK_WINDOW) = 0 then start SetLength(buf1, 1024*8); SetLength(buf2, 1024*8) ; .lpData := PAnsiChar(buf1); whIn1.dwBufferLength: = Длина (buf1); whIn1.dwBytesRecorded: = 0; whIn1.dwFlags: = 0; whIn1.dwLoops: = 0; whIn1.lpNext: = ноль; 0; wIn2.lpData := PAnsiChar(buf2); whIn2.dwBufferLength: = Длина (buf2); whIn2.dwBytesRecorded: = 0; whIn2.dwFlags: = 0; whIn2.dwLoops: = 0; 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; //Остановка процедуры записи TForm1.Button2Click(Sender: TObject); waveInUnprepareHeader(hWaveIn, @whIn1, SizeOf(TWaveHdr)); waveInUnprepareHeader(hWaveIn, @whIn2, SizeOf); (TWaveHdr)); waveInClose(hWaveIn); //Процедура записи TForm1.Button3Click(Sender: TObject); start whOut.lpData := PAnsiChar(SaveBuf); whOut.dwBufferLength := Длина(SaveBuf); whOut.dwBytesRecorded := 0; .dwUser:= 0; whOut.dwFlags:= 0; whOut.dwLoops: = 1; whOut.lpNext: = ноль; whOut.reserved: = 0; waveOutOpen(@hWaveOut, WAVE_MAPPER, @fmt, Handle, 0, CALLBACK_WINDOW); waveOutPrepareHeader(hWaveOut, @whOut, SizeOf(TWaveHdr)) ; waveOutWrite(hWaveOut, @whOut, SizeOf(TWaveHdr)); end; процедура TForm1.WndProc(var m: TMessage); var ordLen: Integer; start inherited; case m.Msg of {обработка сообщения записи} MM_WIM_OPEN: {это сообщение содержит только дескриптор устройства} MM_WIM_CLOSE : ; {Это сообщение содержит только дескриптор устройства} MM_WIM_DATA: начало {Это сообщение содержит дескриптор устройства и указатель WaveHdr (LParam)} {Сохраните записанные данные} ordLen := Длина(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)); {обработка сообщения воспроизведения} MM_WOM_OPEN: ; {Это сообщение содержит только дескриптор устройства} MM_WOM_CLOSE: ; {Это сообщение содержит только дескриптор устройства} MM_WOM_DONE: start {Это сообщение содержит дескриптор устройства и указатель WaveHdr (LParam)} waveOutUnprepareHeader(hWaveOut, PWaveHdr(m.LParam), SizeOf(TWaveHdr)); waveOutClose(hWaveOut end); конец; конец;
Я надеюсь, что эта статья будет полезна каждому программисту на Delphi.