如何利用MediaPlayer来实现录音功能

解决方案 »

  1.   

    // 全局变量varBufferFinished : 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);varTempInt, TempCode: integer;TempFileName: string;MMR: MMResult;MyWaveFormat: TWaveFormatEx;beginPrgsBarSpace.Position := 0;Recording := false;OldDiskFree := DiskFree (RecordDrive);with RecordWaveFormat dobeginif RdoBtnMono.Checked = true thenChannels := 1elseChannels := 2;if RdoBtn8Bit.Checked = true thenBitsPerSample := 8elseBitsPerSample := 16;Val (EditFrequency.Text, TempInt, TempCode);if TempCode <> 0 thenbeginApplication.MessageBox ('无效数值', '错误', MB_Ok);exit;endelse if TempInt > 48000 thenbeginApplication.MessageBox('不能大于48000赫兹', '错误', MB_Ok);exit;endelsebeginSamplesPerSecond := TempInt;end;BytesPerSecond := SamplesPerSecond * Channels * BitsPerSample div8;BlockAlign := BitsPerSample * Channels div 8 ;end;TempFileName := TempFileNameGenerator (Self.TempPath, 'WM_', 'TMP',5);AssignFile (RecordFile, TempFileName);Rewrite (RecordFile, 1);if IOResult <> 0 thenbeginApplication.Messagebox ('无法创建暂时文件,请检查临时目录设定。','严重错误', MB_OK);exit;end;RecordFileName := TempFileName;RecordSuccess := false; // 由于文件名已经改变,所以在这里修改该变量。 // Preparation jobs hereSttTextElapsedTime.Caption := '00:00:00';ElapsedHours := 0;ElapsedMinutes := 0;ElapsedSeconds := 0;CurrentUsingBuffer := 1;TotalRecordedSize := 0;BufferFinished := false;UserStopRecord := false;RecordBufferSize := RecordWaveFormat.BytesPerSecond * 2; // for 2 secondsBuffer1 := nil;Buffer2 := nil;tryGetMem (Buffer1, RecordBufferSize);exceptApplication.MessageBox ('内存不足,分配第一缓冲区失败。', '错误',MB_OK);end;tryGetMem (Buffer2, RecordBufferSize);exceptApplication.MessageBox ('内存不足,分配第二缓冲区失败。', '错误',MB_OK);end;if (Buffer1 = nil) or (Buffer2 = nil) thenbeginCloseFile (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 thenbeginFreeMem (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 datawaveInHeader1.dwFlags := 0;waveInHeader1.dwLoops := 0;waveInHeader1.lpNext := nil; // reserved; must be zerowaveInHeader1.reserved := 0; // reserved; must be zeroMMR := waveInPrepareHeader (waveInHandle, Addr (waveInHeader1),sizeof (waveInHeader1));if MMR <> MMSYSERR_NOERROR thenbeginFreeMem (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 datawaveInHeader2.dwFlags := 0;waveInHeader2.dwLoops := 0;waveInHeader2.lpNext := nil; // reserved; must be zerowaveInHeader2.reserved := 0; // reserved; must be zeroMMR := waveInPrepareHeader (waveInHandle, Addr (waveInHeader2),sizeof (waveInHeader2));if MMR <> MMSYSERR_NOERROR thenbeginwaveInUnprepareHeader (waveInHandle, Addr (waveInHeader1), sizeof(waveInHeader1));FreeMem (Buffer1); FreeMem (Buffer2);RecordBufferSize := 0;CloseFile (RecordFile);Application.MessageBox ('第二录音缓冲区准备出错。', '错误', MB_OK);exit;end; 
      

  2.   

    MMR := waveInAddBuffer (WaveInHandle, Addr (waveInHeader1), sizeof (waveInHeader1));if MMR <> MMSYSERR_NOERROR thenbeginwaveInUnprepareHeader (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 thenbeginwaveInUnprepareHeader (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 thenbeginwaveInUnprepareHeader (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)doOnTerminate := ThreadRecordStop;// disable/enable controlsBtnCancel.Enabled := false;BtnStart.Enabled := false;GrpBoxChannel.Enabled := false;LBFrequency.Enabled := false;EditFrequency.Enabled := false;LstBoxFrequency.Enabled := false;GrpBoxSample.Enabled := false;BtnStop.Enabled := true;end;
    超级猛料