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

📄 trecordwaveunit.pas

📁 语音与识别技术包含很多C语言处理模块系统
💻 PAS
📖 第 1 页 / 共 2 页
字号:
//***********************************************************************//
//                                                                       //
//   录音单元                                                            //
//   单元名: TRecordWaveUnit                                             //
//   功能: 录音                                                          //
//   实现方法: 采用音频底层操作                                          //
//   特点: 录音的同时显示波形                                            //
//   日期: 2003 年 1月 13日                                              //
//                                                                       //
//***********************************************************************//

unit TRecordWaveUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, MMSystem, ExtCtrls,
  Dialogs, Forms, TCMWaveType;

Type
  TCMRecordWave = Class
  private
    { Private declarations }
    hwi: HWAVEIN;                               //设备句柄
    TempFileName: String;                       //录音数据保存的临时文件
    TRecordHdr: TWAVEFORMATEX;                  //波形格式
    FNowRecord: TCMRecording;                   //当前处于何种状态下
    FileSize: LongInt;                          //音频数据的长度( 临时文件的长度 )
    FDesBMP: TBitMap;                           //画波形的源图像对象
    FDrawWave: TPaintBox;                       //波形显示的目标对象
    FWaveFileName: String;                      //停止录音后, 音频数据所保存的音频文件
    FSaveFileName: String;                      //指定保存的文件名
    FDrawBackColor: TColor;                     //波形背景颜色
    FDrawLineColor: TColor;                     //波形颜色
    procedure SetDesBMP(const Value: TBitMap);  //设置画波形的源图像对象
    procedure SetDrawWave(const Value: TPaintBox);  //设置波形显示的目标对象
    procedure SetWaveSaveFileName(const Value: String); //设置录音保存的文件
    function GetWaveSaveFileName: String;       //取音频文件
    procedure SetDrawBackColor(const Value: TColor);//设置波形背景颜色
    procedure SetDrawLineColor(const Value: TColor);//设置波形颜色
  public
    { Public declarations }
    constructor Create; reintroduce; overload;  //构造器
    destructor Destroy; override;               //析构器
    procedure Free;                             //释放
    procedure CloseFile;                        //关闭打开的文件
    procedure Start;                            //开始录音
    procedure Stop;                             //停止录音
    procedure Pause;                            //暂停录音
    procedure Restart;                          //恢复录音
    property NowRecord: TCMRecording read FNowRecord;  //当前处于何种状态下
    //波形显示的目标对象
    property DrawWave: TPaintBox read FDrawWave write SetDrawWave;
    //画波形的源图像对象
    property DesBMP: TBitMap read FDesBMP write SetDesBMP;
    //停止录音后, 音频数据所保存的音频文件
    property WaveFileName: String read GetWaveSaveFileName write SetWaveSaveFileName;
    property DrawLineColor: TColor read FDrawLineColor write SetDrawLineColor;
    property DrawBackColor: TColor read FDrawBackColor write SetDrawBackColor;
  end;

implementation

//***********************************************************************//
//                                                                       //
//   TCMRecordWave 的实现部分                                            //
//                                                                       //
//***********************************************************************//
{ TCMRecordWave }

//***********************************************************************//
//                                                                       //
//   构造器                                                              //
//                                                                       //
//***********************************************************************//
constructor TCMRecordWave.Create;
var
  TempDir: array[0..255] of Char;       //Windows 操作系统的临时路径
  TempStr: String;
  i: Integer;
const
  SaveTempFile = 'CMRecordWave';
begin
  Self.FSaveFileName := '';             //没有指定保存的文件名

  if WaveInGetNumDevs = 0 then          //查找音频输入设备
     raise EMMIO.Create('找不到音频输入设备');

  inherited;    //执行父类( TObject )的构造器

  GetTempPath(255, @TempDir);           //取得操作系统的临时目录
  i := 0;
  TempStr := StrPas(TempDir) + SaveTempFile;
  While TRUE do
  begin //查找文件
     if Not FileExists(TempStr + IntToStr(i) + '.tmp') then
     begin      //没有找到文件
        Self.TempFileName := TempStr + IntToStr(i) + '.tmp';
        break;  //录音数据保存的临时文件
     end;
     INC(i);
  end;
  i := 0;
  While TRUE do
  begin
     if Not FileExists(TempStr + IntToStr(i) + '.wav') then
     begin
        Self.FWaveFileName := TempStr + IntToStr(i) + '.wav';
        break;  //停止录音后, 音频数据所保存的音频文件
     end;
     INC(i);
  end;
  Self.FileSize := 0;
  Self.hwi := 0;
  Self.FNowRecord := CRNONE;            //当前没有任何状态

  Self.FDrawBackColor := clWhite;
  Self.FDrawLineColor := clBlue;
end;

//***********************************************************************//
//                                                                       //
//   析构器                                                              //
//                                                                       //
//***********************************************************************//
destructor TCMRecordWave.Destroy;
begin
  DeleteFile(Self.TempFileName);        //删除临时文件
  DeleteFile(Self.WaveFileName);
  inherited;
end;

//***********************************************************************//
//                                                                       //
//   释放                                                                //
//   参数: 无                                                            //
//   返回值: 无                                                          //
//                                                                       //
//***********************************************************************//
procedure TCMRecordWave.Free;
begin
  if Self <> NIL then                           //如果已实例化
     Self.Destroy;
end;                                   

//***********************************************************************//
//                                                                       //
//   关闭打开的文件                                                      //
//   参数: 无                                                            //
//   返回值: 无                                                          //
//                                                                       //
//***********************************************************************//
procedure TCMRecordWave.CloseFile;
begin
  Self.FSaveFileName := '';
end;

//***********************************************************************//
//                                                                       //
//   暂停录音                                                            //
//   参数: 无                                                            //
//   返回值: 无                                                          //
//                                                                       //
//***********************************************************************//
function TCMRecordWave.GetWaveSaveFileName: String;
begin
  if Self.FSaveFileName = '' then
     Result := Self.FWaveFileName
  else
     Result := Self.FSaveFileName;
end;                                      

//***********************************************************************//
//                                                                       //
//   暂停录音                                                            //
//   参数: 无                                                            //
//   返回值: 无                                                          //
//                                                                       //
//***********************************************************************//
procedure TCMRecordWave.Pause;
begin
  if Self.NowRecord <> CRRECORDING then         //不是在播放状态下
     Exit;
  WaveInStop(Self.hwi);                         //暂停录音
  Self.FNowRecord := CRPAUSEING;                //处于暂停状态
end;

//***********************************************************************//
//                                                                       //

⌨️ 快捷键说明

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