⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trecordwaveunit.pas

📁 语音与识别技术包含很多C语言处理模块系统
💻 PAS
📖 第 1 页 / 共 2 页
字号:
//   恢复录音                                                            //
//   参数: 无                                                            //
//   返回值: 无                                                          //
//                                                                       //
//***********************************************************************//
procedure TCMRecordWave.Restart;
begin
  if Self.NowRecord <> CRPAUSEING then          //不是在暂停状态下
     Exit;
  WaveInStart(Self.hwi);                        //开始录音
  Self.FNowRecord := CRRECORDING;               //处于录音状态
end;

//***********************************************************************//
//                                                                       //
//   设置设置画波形的源图像对象                                          //
//   参数:                                                               //
//       Value : 要指向的源图像对象                                      //
//   返回值: 无                                                          //
//                                                                       //
//***********************************************************************//
procedure TCMRecordWave.SetDesBMP(const Value: TBitMap);
begin
  Self.FDesBMP := Value;
end;

//***********************************************************************//
//                                                                       //
//   设置波形显示的目标对象                                              //
//   参数:                                                               //
//       Value : 要指向的目标对象                                        //
//   返回值: 无                                                          //
//                                                                       //
//***********************************************************************//
procedure TCMRecordWave.SetDrawWave(const Value: TPaintBox);
begin
  Self.FDrawWave := Value;
end;

//***********************************************************************//
//                                                                       //
//   设置录音保存的文件                                                  //
//   参数:                                                               //
//       Value : 目标文件
//   返回值: 无                                                          //
//                                                                       //
//***********************************************************************//
procedure TCMRecordWave.SetWaveSaveFileName(const Value: String);
begin
  if FileExists(Value) then
     DeleteFile(Value);
  Self.FSaveFileName := Value;
end;

//***********************************************************************//
//                                                                       //
//   开始录音                                                            //
//   参数: 无                                                            //
//   返回值: 无                                                          //
//                                                                       //
//***********************************************************************//
procedure TCMRecordWave.Start;
var
  RecordWaveBuf: PChar;         //音频数据保存的缓存
  RecordHDr: TWAVEHDR;          //音频信息头
  tm: TMMTime;                  //已录音多长时间
  Diff: Longint;                //音频数据的长度
  TempFile: Integer;            //临时文件句柄
  Flag: Integer;                //波形显示周期
const
  RecordDataLength = 8000;      //缓冲区长度
begin
  if Not ((Self.NowRecord = CRNONE) or (Self.NowRecord = CRSTOPING)) then
     Exit;

  Self.FNowRecord := CRRECORDING;       //正在录音
  TempFile := FileCreate(Self.TempFileName);    //创建一个临时文件用于保存录音数据

  //设置音频文件头
  Self.TRecordHdr.wFormatTag := WAVE_FORMAT_PCM;        //格式类型
  Self.TRecordHdr.nChannels := 1;                       //声道数据
  Self.TRecordHdr.nSamplesPerSec := 8000;               //采样频率
  Self.TRecordHdr.nAvgBytesPerSec := 16000;             //平均数据传输率
  Self.TRecordHdr.wBitsPerSample := 16;                 //采样数据的大小
  Self.TRecordHdr.nBlockAlign := 2;                     //块对齐方式
  Self.TRecordHdr.cbSize := 0;                          //加在本结构后的格式数据的大小

  //打开音频输入设备
  WaveInOpen(@Self.hwi, WAVE_MAPPER, @Self.TRecordHdr, 0, 0, CALLBACK_NULL);
  Try
    //开辟内存
    RecordWaveBuf := PChar(GlobalAllocPtr(GMEM_MOVEABLE or GMEM_SHARE, RecordDataLength));

    Try  //设置信息头
      RecordHDr.lpData := RecordWaveBuf;
      RecordHDr.dwBufferLength := RecordDataLength;
      RecordHDr.dwFlags := 0;
      //生成信息头
      WaveInPrepareHeader(Self.hwi, @RecordHDr, SizeOf(TWAVEHDR));
      //增加数据缓冲
      WaveInAddBuffer(Self.hwi, @RecordHDr, SizeOf(TWAVEHDR));

      WaveInStart(Self.hwi);    //开始录音
      Self.FileSize := 0;       //音频数据长度
      while Self.NowRecord <> CRSTOPING do
      begin             //没有停止
        Application.ProcessMessages;            //处理消息
        if (RecordHDr.dwFlags and WHDR_DONE) <> 0 then  //数据缓冲已填满
        begin
          tm.wType := TIME_BYTES;
          WaveInGetPosition(Self.hwi, @tm, SizeOf(TMMTime));    //取当前播放位置
          Diff := Longint(tm.cb) - Self.FileSize;       //数据长度
          Self.FileSize := Longint(tm.cb);
          Flag := Diff DIV 2 Div Self.FDrawWave.ClientWidth + 1;  //波形显示周期
          if Flag <= 0 then Flag := 1;
          if (Self.DrawWave <> NIL) AND (Self.DesBMP <> NIL) then //画波形  
              DrawPartWave(Flag, RecordWaveBuf, Diff, Self.FDrawWave.Canvas,
                       Self.FDrawWave.ClientHeight, Self.FDrawWave.ClientWidth,
                       Self.FDesBMP, Self.FDrawLineColor, Self.FDrawBackColor);
          FileWrite(TempFile, RecordWaveBuf^, Diff);    //写入临时文件中
          //增加一 数据缓冲区
          waveInAddBuffer(Self.hwi, @RecordHDr, SizeOf(TWAVEHDR));
         end;
      end;
      WaveInReset(Self.hwi);    //停止录音
      //清除信息头
      WaveInUnPrepareHeader(Self.hwi, @RecordHDr, SizeOf(TWAVEHDR));
    Finally
      GloBalFreePtr(RecordWaveBuf);     //释放内存
      FileClose(TempFile);              //关闭文件
    end;
  Finally
    WaveInClose(Self.hwi);              //关闭音频输入设备
    Self.FNowRecord := CRSTOPING;
  end;

  if FileExists(Self.FWaveFileName) then
     DeleteFile(Self.FWaveFileName);    //删除临时音频文件

  //保存为音频文件
  if Self.FSaveFileName = '' then
     Wave_SaveFile(Self.FWaveFileName, Self.TempFileName, Self.FileSize, Self.TRecordHdr, 0, CS_SAVE_RECORD)
  else
     Wave_SaveFile(Self.FSaveFileName, Self.TempFileName, Self.FileSize, Self.TRecordHdr, 0, CS_SAVE_RECORD);
  Self.FNowRecord := CRNONE;
end;

//***********************************************************************//
//                                                                       //
//   停止录音                                                            //
//   参数: 无                                                            //
//   返回值: 无                                                          //
//                                                                       //
//***********************************************************************//
procedure TCMRecordWave.Stop;
begin
  if (Self.FNowRecord = CRNONE) OR (Self.FNowRecord = CRSTOPING) then
     Exit;
  Self.FNowRecord := CRSTOPING;
end;

//***********************************************************************//
//                                                                       //
//   设置波形的背景颜色                                                  //
//   参数:                                                               //
//        Value : 波形背景色                                             //
//   返回值: 无                                                          //
//                                                                       //
//***********************************************************************//
procedure TCMRecordWave.SetDrawBackColor(const Value: TColor);
begin
  FDrawBackColor := Value;
end;

//***********************************************************************//
//                                                                       //
//   设置波形的颜色                                                      //
//   参数:                                                               //
//        Value : 波形颜色                                               //
//   返回值: 无                                                          //
//                                                                       //
//***********************************************************************//
procedure TCMRecordWave.SetDrawLineColor(const Value: TColor);
begin
  FDrawLineColor := Value;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -