使用简单类进行语音录制/播放






4.62/5 (35投票s)
2005年4月17日
1分钟阅读

487743

12252
本文介绍了一些有用的类,它们封装了WAVE API。
引言
我们大多数人都熟悉至少一个多媒体录音软件。Windows 拥有最简单的软件之一:录音机。 在本文中,我想介绍一些简单但有用的类,用于录制/播放语音,这些类封装了WAVE API。
WAVE API
以下是我使用的所有Wave API的列表
Recording
waveInOpen |
打开Wave设备进行录音。 |
waveInPrepareHeader |
为录音准备Wave头。 |
waveInAddBuffer |
添加缓冲区 |
waveInStart |
开始录音。 录制的数据将保存在指定的缓冲区中。 |
waveInUnprepareHeader |
完成录音过程后,应取消准备Wave头。 |
waveInClose |
关闭录音设备。 |
状态时进行,否则就没有理由调用该函数。
waveOutOpen |
打开Wave设备进行播放。 |
waveOutPrepareHeader |
为播放准备Wave头。 |
waveOutWrite |
播放缓冲区。 |
waveOutUnprepareHeader |
取消准备Wave头。 |
waveOutClose |
关闭播放设备。 |
如您所见,使用这些API 非常简单,但如果您想跳过它们并在您的项目中简单地复制/粘贴代码,那么我的类就是为您准备的。
以下是类的定义
class CVoiceBase { public: CString m_result; MMRESULT res; enum { SPS_8K=8000, SPS_11K=11025, SPS_22K=22050, SPS_44K=44100 }; enum { CH_MONO=1, CH_STEREO=2 }; char* buffer; WAVEHDR WaveHeader; WAVEFORMATEX PCMfmt; void SetFormat(DWORD nSamplesPerSec, WORD wBitsPerSample,WORD nChannels); BOOL CopyBuffer(LPVOID lpBuffer, DWORD ntime); CString GetLastError(); void GetMMResult(MMRESULT res); void DestroyBuffer(); BOOL PrepareBuffer(DWORD ntime); CVoiceBase(); virtual ~CVoiceBase(); }; class CVoiceRecording : public CVoiceBase { public: void RecordFinished(); BOOL IsOpen(); BOOL Close(); BOOL Open(); BOOL Record(); HWAVEIN hWaveIn; CVoiceRecording(); virtual ~CVoiceRecording(); }; class CVoicePlaying : public CVoiceBase { public: void PlayFinished(); BOOL IsOpen(); BOOL Close(); BOOL Open(); BOOL Play(); HWAVEOUT hWaveOut; CVoicePlaying(); virtual ~CVoicePlaying(); };
此外,为了通知事件,例如完成录音/播放,我使用了两个回调函数
BOOL CALLBACK VoiceWaveInProc(HWAVEIN hwi, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2 ); BOOL CALLBACK VoiceWaveOutProc(HWAVEOUT hwi, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2 );
示例
只需声明两个类型的变量 CVoiceRecording
和 CVoicePlaying
。 使用 SetFormat
、PrepareBuffer
、Open
和 Record
或 Play
成员函数来使用它们
CVoiceRecording m_Record; CVoicePlaying m_Play; m_Record.PrepareBuffer(10); //prepare buffer for recording 10 seconds. m_Record.Open(); m_Play.PrepareBuffer(10); //prepare buffer for playing of 10 seconds of data m_Play.Open(); if (m_Record.IsOpen()) { m_Record.Record(); } //after finishing the record scenario, //play the buffer, first copy recorded buffer to m_Play buffer m_Play.CopyBuffer(m_Record.buffer, 10); if (m_Play.IsOpen()) { m_Play.Play(); }
尽情享用!