65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.62/5 (35投票s)

2005年4月17日

1分钟阅读

viewsIcon

487743

downloadIcon

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     
                );

示例

只需声明两个类型的变量 CVoiceRecordingCVoicePlaying。 使用 SetFormatPrepareBufferOpenRecordPlay 成员函数来使用它们

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();
}

尽情享用!

© . All rights reserved.