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






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(); }
尽情享用!
