📄 trecordwaveunit.pas
字号:
// 恢复录音 //
// 参数: 无 //
// 返回值: 无 //
// //
//***********************************************************************//
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 + -