📄 trecordwaveunit.pas
字号:
//***********************************************************************//
// //
// 录音单元 //
// 单元名: 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 + -