如何在delphi中使用mciapi编写wave文件的录制程序?

fenfen 2000-05-22 09:37:00
近日我因为一个多媒体项目中需要在delphi中实现外部录音的功能,现在缺少用mciapi
编写录音程序的资料,希望各位高手多多指点!
...全文
273 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fireworld 2001-04-19
  • 打赏
  • 举报
回复
哇.....这么深奥的问题。我听都没有听过,提问的大虾你的EMAIL是多少?
我以后有问题问你算了。谢谢
violing 2001-04-19
  • 打赏
  • 举报
回复
哎呀,我们需要的是Delphi的解决办法啊?
Kingron 2001-04-19
  • 打赏
  • 举报
回复
下面是一个大虾的贴子:
请原谅忘记作者是谁了。
// 全局变量
var
BufferFinished : boolean; // indicates current record buffer is full
.
UserStopRecord: boolean;
Recording: boolean;

WaveInHandle: HWaveIn;

CurrentUsingBuffer: integer;
WaveInHeader1: TWaveHdr;
WaveInHeader2: TWaveHdr;

RecordBufferSize: integer;
TotalRecordedSize: DWORD;


//进行录音
procedure TDlgRecord.BtnStartClick(Sender: TObject);
var
TempInt, TempCode: integer;
TempFileName: string;

MMR: MMResult;
MyWaveFormat: TWaveFormatEx;

begin
PrgsBarSpace.Position := 0;
Recording := false;
OldDiskFree := DiskFree (RecordDrive);
with RecordWaveFormat do
begin
if RdoBtnMono.Checked = true then
Channels := 1
else
Channels := 2;
if RdoBtn8Bit.Checked = true then
BitsPerSample := 8
else
BitsPerSample := 16;
Val (EditFrequency.Text, TempInt, TempCode);
if TempCode <> 0 then
begin
Application.MessageBox ('无效数值', '错误', MB_Ok);
exit;
end
else if TempInt > 48000 then
begin
Application.MessageBox('不能大于48000赫兹', '错误', MB_Ok);
exit;
end
else
begin
SamplesPerSecond := TempInt;
end;
BytesPerSecond := SamplesPerSecond * Channels * BitsPerSample div
8;
BlockAlign := BitsPerSample * Channels div 8 ;
end;

TempFileName := TempFileNameGenerator (Self.TempPath, 'WM_', 'TMP',
5);

AssignFile (RecordFile, TempFileName);
Rewrite (RecordFile, 1);
if IOResult <> 0 then
begin
Application.Messagebox ('无法创建暂时文件,请检查临时目录设定。',
'严重错误', MB_OK);
exit;
end;

RecordFileName := TempFileName;
RecordSuccess := false; // 由于文件名已经改变,所以在这里修改该变量。


// Preparation jobs here
SttTextElapsedTime.Caption := '00:00:00';
ElapsedHours := 0;
ElapsedMinutes := 0;
ElapsedSeconds := 0;
CurrentUsingBuffer := 1;
TotalRecordedSize := 0;
BufferFinished := false;
UserStopRecord := false;
RecordBufferSize := RecordWaveFormat.BytesPerSecond * 2; // for 2 se
conds
Buffer1 := nil;
Buffer2 := nil;

try
GetMem (Buffer1, RecordBufferSize);
except
Application.MessageBox ('内存不足,分配第一缓冲区失败。', '错误',
MB_OK);
end;

try
GetMem (Buffer2, RecordBufferSize);
except
Application.MessageBox ('内存不足,分配第二缓冲区失败。', '错误',
MB_OK);
end;

if (Buffer1 = nil) or (Buffer2 = nil) then
begin
CloseFile (RecordFile);
exit;
end;

MyWaveFormat.wFormatTag := WAVE_FORMAT_PCM;
MyWaveFormat.nChannels := RecordWaveFormat.Channels;
MyWaveFormat.nSamplesPerSec := RecordWaveFormat.SamplesPerSecond;
MyWaveFormat.nAvgBytesPerSec := RecordWaveFormat.BytesPerSecond;
MyWaveFormat.nBlockAlign := RecordWaveFormat.BlockAlign;
MyWaveFormat.wBitsPerSample := RecordWaveFormat.BitsPerSample;
MyWaveFormat.cbSize := 0;

MMR := waveInOpen (Addr (waveInHandle),
SelectedDevice,
Addr (MyWaveFormat),
DWORD (Addr (WaveInCallBack)),
0,
CALLBACK_FUNCTION);
if MMR <> MMSYSERR_NOERROR then
begin
FreeMem (Buffer1); FreeMem (Buffer2);
RecordBufferSize := 0;
CloseFile (RecordFile);
Application.MessageBox ('无法打开输入设备,请检查设定。', '错误',
MB_OK);
exit;
end;

waveInHeader1.lpData := Buffer1;
waveInHeader1.dwBufferLength := RecordBufferSize;
waveInHeader1.dwBytesRecorded := 0;
waveInHeader1.dwUser := 0; // 32 bits of user data
waveInHeader1.dwFlags := 0;
waveInHeader1.dwLoops := 0;
waveInHeader1.lpNext := nil; // reserved; must be zero
waveInHeader1.reserved := 0; // reserved; must be zero
MMR := waveInPrepareHeader (waveInHandle, Addr (waveInHeader1),
sizeof (waveInHeader1));
if MMR <> MMSYSERR_NOERROR then
begin
FreeMem (Buffer1); FreeMem (Buffer2);
RecordBufferSize := 0;
CloseFile (RecordFile);
Application.MessageBox ('第一录音缓冲区准备出错。', '错误', MB_OK)
;
exit;
end;

waveInHeader2.lpData := Buffer2;
waveInHeader2.dwBufferLength := RecordBufferSize;
waveInHeader2.dwBytesRecorded := 0;
waveInHeader2.dwUser := 0; // 32 bits of user data
waveInHeader2.dwFlags := 0;
waveInHeader2.dwLoops := 0;
waveInHeader2.lpNext := nil; // reserved; must be zero
waveInHeader2.reserved := 0; // reserved; must be zero

MMR := waveInPrepareHeader (waveInHandle, Addr (waveInHeader2),
sizeof (waveInHeader2));
if MMR <> MMSYSERR_NOERROR then
begin
waveInUnprepareHeader (waveInHandle, Addr (waveInHeader1), sizeof(
waveInHeader1));
FreeMem (Buffer1); FreeMem (Buffer2);
RecordBufferSize := 0;
CloseFile (RecordFile);
Application.MessageBox ('第二录音缓冲区准备出错。', '错误', MB_OK)
;
exit;
end;

MMR := waveInAddBuffer (WaveInHandle, Addr (waveInHeader1), sizeof (
waveInHeader1));
if MMR <> MMSYSERR_NOERROR then
begin
waveInUnprepareHeader (waveInHandle, Addr (waveInHeader1), sizeof(
waveInHeader1));
waveInUnprepareHeader (waveInHandle, Addr (waveInHeader2), sizeof(
waveInHeader2));
FreeMem (Buffer1); FreeMem (Buffer2);
RecordBufferSize := 0;
CloseFile (RecordFile);
Application.MessageBox ('添加第一缓冲区出错。', '错误', MB_OK);
exit;
end;

MMR := waveInAddBuffer (WaveInHandle, Addr (waveInHeader2), sizeof (
waveInHeader2));
if MMR <> MMSYSERR_NOERROR then
begin
waveInUnprepareHeader (waveInHandle, Addr (waveInHeader1), sizeof(
waveInHeader1));
waveInUnprepareHeader (waveInHandle, Addr (waveInHeader2), sizeof(
waveInHeader2));
FreeMem (Buffer1); FreeMem (Buffer2);
RecordBufferSize := 0;
CloseFile (RecordFile);
Application.MessageBox ('添加第二缓冲区出错。', '错误', MB_OK);
exit;
end;


TimerRecording.Enabled := true;
// Record has begun.
Recording := true;

MMR := waveInStart (waveInHandle);
if MMR <> MMSYSERR_NOERROR then
begin
waveInUnprepareHeader (waveInHandle, Addr (waveInHeader1), sizeof(
waveInHeader1));
waveInUnprepareHeader (waveInHandle, Addr (waveInHeader2), sizeof(
waveInHeader2));
FreeMem (Buffer1); FreeMem (Buffer2);
RecordBufferSize := 0;
CloseFile (RecordFile);
Recording := false;
TimerRecording.Enabled := false;
Application.MessageBox ('未能开始录音。', '错误', MB_OK);
exit;
end;

// 应该在这里开始创建线程.
// 需要传递参数: RecordFile, Buffer1, Buffer2,
with TMediaRecordThread.Create (Addr(RecordFile), Buffer1, Buffer2)
do
OnTerminate := ThreadRecordStop;

// disable/enable controls
BtnCancel.Enabled := false;
BtnStart.Enabled := false;
GrpBoxChannel.Enabled := false;
LBFrequency.Enabled := false;
EditFrequency.Enabled := false;
LstBoxFrequency.Enabled := false;
GrpBoxSample.Enabled := false;

BtnStop.Enabled := true;

end;
yiyu 2001-02-13
  • 打赏
  • 举报
回复
不知道这个问题有没有解决?? 如果解决能不能告诉我??

Email:mailto_yiyu@cmmail.com

谢谢!!!!
yiyu 2001-02-13
  • 打赏
  • 举报
回复
不知道这个问题有没有解决?? 如果解决能不能告诉我??
hhzh426 2000-06-10
  • 打赏
  • 举报
回复
listen!
Un1 2000-05-23
  • 打赏
  • 举报
回复
'打开

Dim mWaveInFmt As WAVEFORMATEX
With mWaveInFmt

.nChannels = 1
......
End With

' Open Input Wave Device, Let WAVE_MAPPER Pick The Best Device...
l = waveInOpen(hWaveIn, WAVE_MAPPER, mWaveInFmt, 0, 0, CALLBACK_NULL)
If l Then Err.Raise 68, , "不能打开音频输出设备"

l = mWaveInFmt.nAvgBytesPerSec / CAPTURE_RATE * 2
InitWaveHDR mWaveInHDR, l

l = waveInPrepareHeader(hWaveIn, mWaveInHDR, Len(mWaveInHDR)) ' Validate Return Code


读取:
With WaveInHDR
If (.dwFlags And WHDR_DONE) = WHDR_DONE Then

Dim l As Long
l = .dwBytesRecorded
If l > 0 Then

Dim bt() As Byte
ReDim bt(l - 1)

CopyMemory bt(0), ByVal .lpData, l

Dim b As Boolean
b = True

'b = (Year(Date) < 2001)
End If

l = waveInAddBuffer(hWaveIn, WaveInHDR, Len(WaveInHDR)) ' Validate Return Code
If b Then
RaiseEvent Frame(bt)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧