我可怜的大舅哥给我找的录音的代码,哎

// 全局变量
var
 BufferFinished : boolean; // indicates current record buffer is full.
 
 UserStopRecord: boolean;
 Recording: boolean;
 WaveInHandle: HWaveIn;
 CurrentUsingBuffer: integer;
 WaveInHeader1: TWaveHdr;
 WaveInHeader2: TWaveHdr;
 RecordBufferSize: integer;
 TotalRecordedSize: DWORD;
// 进行录音
procedure TDlgRecord.BtnStartClick(Sender: TObject);
var
 TempInt, TempCode: integer;
 TempFileName: string;
 MMR: MMResult;
 MyWaveFormat: TWaveFormatEx;
begin
 PrgsBarSpace.Position := 0;
 Recording := false;
 OldDiskFree := DiskFree (RecordDrive);
 with RecordWaveFormat do
  begin
  if RdoBtnMono.Checked = true then
   Channels := 1
  else
   Channels := 2;
  if RdoBtn8Bit.Checked = true then
   BitsPerSample := 8
  else
   BitsPerSample := 16;
  Val (EditFrequency.Text, TempInt, TempCode);
  if TempCode <> 0 then
   begin
   Application.MessageBox (' 无效数值 ', ' 错误 ', MB_Ok);
   exit;
   end
  else if TempInt > 48000 then
   begin
   Application.MessageBox(' 不能大于 48000 赫兹 ', ' 错误 ', MB_Ok);
   exit;
   end
  else
   begin
   SamplesPerSecond := TempInt;
   end;
  BytesPerSecond := SamplesPerSecond * Channels * BitsPerSample div8;
  BlockAlign := BitsPerSample * Channels div 8 ;
  end;
 TempFileName := TempFileNameGenerator (Self.TempPath, 'WM_', 'TMP',5);
 AssignFile (RecordFile, TempFileName);
 Rewrite (RecordFile, 1);
 if IOResult <> 0 then
  begin
  Application.Messagebox (' 无法创建暂时文件 ,请检查临时目录设定。 ',' 严重错误 ', MB_OK);
  exit;
  end;
 RecordFileName := TempFileName;
 RecordSuccess := false; // 由于文件名已经改变 ,所以在这里修改该变量。
 // Preparation jobs here
 SttTextElapsedTime.Caption := '00:00:00';
 ElapsedHours := 0;
 ElapsedMinutes := 0;
 ElapsedSeconds := 0;
 CurrentUsingBuffer := 1;
 TotalRecordedSize := 0;
 BufferFinished := false;
 UserStopRecord := false;
 RecordBufferSize := RecordWaveFormat.BytesPerSecond * 2; // for 2 seconds
 Buffer1 := nil;
 Buffer2 := nil;
 try
  GetMem (Buffer1, RecordBufferSize);
 except
  Application.MessageBox (' 内存不足 ,分配第一缓冲区失败。 ', ' 错误 ',MB_OK);
 end;
 try
  GetMem (Buffer2, RecordBufferSize);
 except
  Application.MessageBox (' 内存不足 ,分配第二缓冲区失败。 ', ' 错误 ',MB_OK);
 end;
 if (Buffer1 = nil) or (Buffer2 = nil) then
  begin
  CloseFile (RecordFile);
  exit;
  end;
 MyWaveFormat.wFormatTag := WAVE_FORMAT_PCM;
 MyWaveFormat.nChannels := RecordWaveFormat.Channels;
 MyWaveFormat.nSamplesPerSec := RecordWaveFormat.SamplesPerSecond;
 MyWaveFormat.nAvgBytesPerSec := RecordWaveFormat.BytesPerSecond;
 MyWaveFormat.nBlockAlign := RecordWaveFormat.BlockAlign;
 MyWaveFormat.wBitsPerSample := RecordWaveFormat.BitsPerSample;
 MyWaveFormat.cbSize := 0;
 MMR := waveInOpen (Addr (waveInHandle),
  SelectedDevice,
  Addr (MyWaveFormat),
  DWORD (Addr (WaveInCallBack)),
  0,
   CALLBACK_FUNCTION);
 if MMR <> MMSYSERR_NOERROR then
  begin
  FreeMem (Buffer1); FreeMem (Buffer2);
  RecordBufferSize := 0;
  CloseFile (RecordFile);
  Application.MessageBox (' 无法打开输入设备 ,请检查设定。 ', ' 错误 ',MB_OK);
  exit;
  end;
 waveInHeader1.lpData := Buffer1;
 waveInHeader1.dwBufferLength := RecordBufferSize;
 waveInHeader1.dwBytesRecorded := 0;
 waveInHeader1.dwUser := 0; // 32 bits of user data
 waveInHeader1.dwFlags := 0;
 waveInHeader1.dwLoops := 0;
 waveInHeader1.lpNext := nil; // reserved; must be zero
 waveInHeader1.reserved := 0; // reserved; must be zero
 MMR := waveInPrepareHeader (waveInHandle, Addr (waveInHeader1), sizeof (waveInHeader1));
 if MMR <> MMSYSERR_NOERROR then
  begin
  FreeMem (Buffer1); FreeMem (Buffer2);
  RecordBufferSize := 0;
  CloseFile (RecordFile);
  Application.MessageBox (' 第一录音缓冲区准备出错。 ', ' 错误 ', MB_OK);
  exit;
  end;
 waveInHeader2.lpData := Buffer2;
 waveInHeader2.dwBufferLength := RecordBufferSize;
 waveInHeader2.dwBytesRecorded := 0;
 waveInHeader2.dwUser := 0; // 32 bits of user data
 waveInHeader2.dwFlags := 0;
 waveInHeader2.dwLoops := 0;
 waveInHeader2.lpNext := nil; // reserved; must be zero
 waveInHeader2.reserved := 0; // reserved; must be zero
 MMR := waveInPrepareHeader (waveInHandle, Addr (waveInHeader2), sizeof (waveInHeader2));
 if MMR <> MMSYSERR_NOERROR then
  begin
  waveInUnprepareHeader (waveInHandle, Addr (waveInHeader1), sizeof(waveInHeader1));
  FreeMem (Buffer1); FreeMem (Buffer2);
  RecordBufferSize := 0;
  CloseFile (RecordFile);
  Application.MessageBox (' 第二录音缓冲区准备出错。 ', ' 错误 ', MB_OK);
  exit;
  end;
 MMR := waveInAddBuffer (WaveInHandle, Addr (waveInHeader1), sizeof (waveInHeader1));
 if MMR <> MMSYSERR_NOERROR then
  begin
  waveInUnprepareHeader (waveInHandle, Addr (waveInHeader1), sizeof(waveInHeader1));
  waveInUnprepareHeader (waveInHandle, Addr (waveInHeader2), sizeof(waveInHeader2));
  FreeMem (Buffer1); FreeMem (Buffer2);
  RecordBufferSize := 0;
  CloseFile (RecordFile);
  Application.MessageBox (' 添加第一缓冲区出错。 ', ' 错误 ', MB_OK);
  exit;
  end;
 MMR := waveInAddBuffer (WaveInHandle, Addr (waveInHeader2), sizeof (waveInHeader2));
 if MMR <> MMSYSERR_NOERROR then
  begin
  waveInUnprepareHeader (waveInHandle, Addr (waveInHeader1), sizeof(waveInHeader1));
  waveInUnprepareHeader (waveInHandle, Addr (waveInHeader2), sizeof(waveInHeader2));
  FreeMem (Buffer1); FreeMem (Buffer2);
  RecordBufferSize := 0;
  CloseFile (RecordFile);
  Application.MessageBox (' 添加第二缓冲区出错。 ', ' 错误 ', MB_OK);
  exit;
  end;
 TimerRecording.Enabled := true;
 // Record has begun.
 Recording := true;
 MMR := waveInStart (waveInHandle);
 if MMR <> MMSYSERR_NOERROR then
  begin
  waveInUnprepareHeader (waveInHandle, Addr (waveInHeader1), sizeof(waveInHeader1));
  waveInUnprepareHeader (waveInHandle, Addr (waveInHeader2), sizeof(waveInHeader2));
  FreeMem (Buffer1); FreeMem (Buffer2);
  RecordBufferSize := 0;
  CloseFile (RecordFile);
  Recording := false;
  TimerRecording.Enabled := false;
  Application.MessageBox (' 未能开始录音。 ', ' 错误 ', MB_OK);
  exit;
  end;
 // 应该在这里开始创建线程 .
 // 需要传递参数 : RecordFile, Buffer1, Buffer2,
 with TMediaRecordThread.Create (Addr(RecordFile), Buffer1, Buffer2)
do
  OnTerminate := ThreadRecordStop;
 // disable/enable controls
 BtnCancel.Enabled := false;
 BtnStart.Enabled := false;
 GrpBoxChannel.Enabled := false;
 LBFrequency.Enabled := false;
 EditFrequency.Enabled := false;
 LstBoxFrequency.Enabled := false;
 GrpBoxSample.Enabled := false;
 BtnStop.Enabled := true;
end;
原文地址:https://www.cnblogs.com/suanguade/p/4038228.html