zoukankan      html  css  js  c++  java
  • 我可怜的大舅哥给我找的录音的代码,哎

    // 全局变量
    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;
  • 相关阅读:
    关于使用JavaMail注册激活邮箱的注意点
    Maven Web报错:org.apache.jasper.JasperException: Unable to compile class for JSP
    IDEA的中文乱码问题
    深入了解Java动态代理与反射机制
    String、StringBuffer和StringBuilder的区别
    Java中HashCode()和equals()的关系
    Java中向下转型的意义
    局部内部类访问局部变量的问题
    Java内部类的应用场景
    Python os.rmdir() 方法
  • 原文地址:https://www.cnblogs.com/suanguade/p/4038228.html
Copyright © 2011-2022 走看看