不用控件呀,直接用API就可以了,给你的个录制WAVE的函数:
//***********************************************************************//
// //
// 开始录音 //
// 参数: 无 //
// 返回值: 无 //
// //
//***********************************************************************//
procedure TCMRecordWave.Start;
var
RecordWaveBuf: PChar;
// 音频数据保存的缓存
RecordHDr: TWAVEHDR;
// 音频信息头
tm: TMMTime;
// 已录音多长时间
Diff: Longint;
// 音频数据的长度
TempFile: Integer;
// 临时文件句柄
// Flag: Integer;
// 波形显示周期
begin
if not ((Self.NowRecord = CRNONE) or (Self.NowRecord = CRSTOPING)) then
Exit;
Self.FNowRecord := CRRECORDING;
// 正在录音
TempFile := FileCreate(Self.TempFileName);
// 创建一个临时文件用于保存录音数据
//设置音频文件头
Self.TRecordHdr.wFormatTag := WAVE_FORM_FORMAT_TAG;
// 格式类型
Self.TRecordHdr.nChannels := WAVE_FORM_CHANNELS;
// 声道数据
Self.TRecordHdr.nSamplesPerSec := WAVE_FORM_SAMPLES_PER_SEC;
// 采样频率
Self.TRecordHdr.nAvgBytesPerSec := WAVE_FORM_AVG_BYTE_PER_SEC;
// 平均数据传输率
Self.TRecordHdr.wBitsPerSample := WAVE_FORM_BITS_PER_SAMPLE;
// 采样数据的大小
Self.TRecordHdr.nBlockAlign := WAVE_FORM_BLOCK_ALIGN;
// 块对齐方式
Self.TRecordHdr.cbSize := WAVE_FORM_CBSIZE;
// 加在本结构后的格式数据的大小
//打开音频输入设备
WaveInOpen(@Self.hwi, WAVE_MAPPER, @Self.TRecordHdr, 0, 0, CALLBACK_NULL);
// 定义要录制的格式
try
//开辟内存
RecordWaveBuf := PChar(GlobalAllocPtr(GMEM_MOVEABLE or GMEM_SHARE,
WAVE_REC_BUFFER_LENGTH));
try // 设置信息头
RecordHDr.lpData := RecordWaveBuf;
RecordHDr.dwBufferLength := WAVE_REC_BUFFER_LENGTH;
RecordHDr.dwFlags := 0;
// 生成信息头(prepares a buffer for waveform-audio input)
WaveInPrepareHeader(Self.hwi, @RecordHDr, SizeOf(TWAVEHDR));
// 增加数据缓冲(sends an input buffer to the given waveform-audio input device)
WaveInAddBuffer(Self.hwi, @RecordHDr, SizeOf(TWAVEHDR));
WaveInStart(Self.hwi);
// 开始录音
Self.FileSize := 0;
// 音频数据长度
while Self.NowRecord <> CRSTOPINGdo
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;
// 再次保存数据
tm.wType := TIME_BYTES;
WaveInGetPosition(Self.hwi, @tm, SizeOf(TMMTime));
// 取当前播放位置
Diff := Longint(tm.cb) - Self.FileSize;
// 数据长度
Self.FileSize := Longint(tm.cb);
FileWrite(TempFile, RecordWaveBuf^, Diff);
// 写入临时文件中
// waveInAddBuffer(Self.hwi, @RecordHDr, SizeOf(TWAVEHDR));
// 增加一 数据缓冲区
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;