lm68140318 发表于 2023-7-13 20:07:19

打开麦克风

本帖最后由 lm68140318 于 2023-7-13 20:08 编辑




DWORD MicCallBack(HWAVEIN hWaveIn, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2) //录音消息的处理程序
{


        return 0;

}



void CyinpinDlg::OnBnClickedButton1()
{
        CString str;
        int nReturn = waveInGetNumDevs();//获取系统中存在的波形音频输入设备数
       


        //********枚举输入的设备*****************
        for (int i = 0; i < nReturn; i++)
        {
                WAVEINCAPS wic;//WAVEINCAPS结构描述波形音频输入设备的能力
               
                MMRESULT mmresult=waveInGetDevCaps(i, &wic, sizeof(WAVEINCAPS)); //检索给定的波形音频输入设备的信息
               
                str.Format(_T("i=%d 设备名:%s\r\n "),i, wic.szPname);
                ::OutputDebugString(str);
               
               
        }


        //*************音频信息******************

        WAVEFORMATEX waveFormat;//WAVEFORMATEX结构定义了波形音频数据信息
        /*
        typedef struct tWAVEFORMATEX
{
    WORD    wFormatTag;   //波形音频的格式,一般情况下设置为WAVE_FORMAT_PCM
    WORD    nChannels;      //音频声道的数量。可以是1或者2(现在电脑基本上都是左右两个声道,因此一般设置为2)
    DWORD   nSamplesPerSec; // 样本频率,(一般的频率为8khz, 11.025khz, 22.05khz,44.1khz)
    DWORD   nAvgBytesPerSec;// 设置请求的平均数据传输率,,单位为byte/s,创建缓冲大小要参考该值
    WORD    nBlockAlign;    //以字节为单位的块对齐的大小,通常为(nChannels*wBitsPerSample)/8
    WORD    wBitsPerSample; // 设置每个样本的位深,多为8或16
    WORD    cbSize;         // 额外信息的大小,一般不需要,设置为0
} WAVEFORMATEX;
        */


        waveFormat.nSamplesPerSec = 44100;
        waveFormat.wBitsPerSample = 16;
        waveFormat.nChannels = 2;
        waveFormat.cbSize = 0;
        waveFormat.wFormatTag = WAVE_FORMAT_PCM;
        waveFormat.nBlockAlign = (waveFormat.wBitsPerSample * waveFormat.nChannels) / 8;
        waveFormat.nAvgBytesPerSec = waveFormat.nBlockAlign * waveFormat.nSamplesPerSec;




        HWAVEIN phwi;//保存启动的设备





        MMRESULT mmre=waveInOpen(&phwi, WAVE_MAPPER, &waveFormat, (DWORD_PTR)MicCallBack, 0, CALLBACK_FUNCTION); //打开录音设备
        /*
        参数1:LPHWAVEIN phwi【输出】一个特定的录音设备指针,如果设备启动成功,该参数的值将会被赋值为启动的设备
        参数2:UINT_PTR uDeviceID   指定一个需要打开的设备标识【设备ID】
                                        可以使用WAVE_MAPPER选择系统默认录音的设备
        参数3:LPWAVEFORMATEX pwfx进行录音的WAVEFORMATEX结构的指针【音频数据信息】
        参数4:DWORD_PTR dwCallback   录音消息的处理程序,可以设置一个函数、事件句柄、窗口句柄、一个特定的线程。
                        也就是说录音消息产生后,由这个参数对应的值来处理该消息。包括关闭录音、缓冲区已满、开启设备
                        如果不需要回调函数,则此值可以为零
        参数5:DWORD_PTR dwCallbackInstancedwCallback参数的参数列表
        参数6:DWORD fdwOpen      打开设备的标志。 定义了以下值
                        CALLBACK_EVENT        dwCallback         参数是事件句柄
                        CALLBACK_FUNCTION        dwCallback   参数是回调函数
                        CALLBACK_NULL                         无回调机制。 这是默认设置。
                        CALLBACK_THREAD        dwCallback         参数是线程标识符。
                        CALLBACK_WINDOW        dwCallback         参数是窗口句柄。
                        WAVE_MAPPED_DEFAULT_COMMUNICATION_DEVICE        如果指定了此标志并且 uDeviceID 参数 WAVE_MAPPER,则函数将打开默认通信设备
                                                                仅 当 uDeviceID 等于 WAVE_MAPPER时,此标志才适用。注意 需要 Windows 7
                        WAVE_FORMAT_DIRECT        如果指定了此标志,ACM 驱动程序不会对音频数据执行转换。
                        WAVE_FORMAT_QUERY        该函数将查询设备以确定它是否支持给定格式,但它不打开设备
                        WAVE_MAPPED        uDeviceID 参数指定要由波形映射器映射到的波形音频设备
       
        返回值:如果成功,则返回 MMSYSERR_NOERROR=0
                        可能的错误值包括以下内容
                        MMSYSERR_ALLOCATED   已分配指定资源
                        MMSYSERR_BADDEVICEID   指定的设备标识符范围不足
                        MMSYSERR_NODRIVER      不存在设备驱动程序
                        MMSYSERR_NOMEM         无法分配或锁定内存
                        WAVERR_BADFORMAT       尝试使用不受支持的波形音频格式打开

        注意:要想该函数成功执行,必须在开始之前,有录音设备的存在(台式电脑一定要插入麦克风才可以被检测到)
        */


       

}




执行时发生错误:waveInOpen 函数发生问题



陶远航 发表于 2023-7-13 20:07:30

根据你提供的代码,执行时发生错误可能有多种原因。以下是可能的解决方案:

1. 检查设备和权限:确保计算机上已连接麦克风,并且具有适当的权限以访问音频设备。您可以尝试使用其他应用程序(如语音通话软件)测试麦克风是否正常工作。

2. 检查库文件:确保正确链接了所需的库文件。在编译和链接过程中,请确保使用了正确版本的库文件,并将其路径设置正确。

3. 错误处理:在调用waveInOpen函数之后,您可以检查返回的mmre值以获得更多信息。您可以根据错误代码采取相应的措施。例如,如果返回值为MMSYSERR_ALLOCATED,表示资源已被分配,您可以尝试释放相应的资源后再次尝试。

除此之外,如果您能提供更详细的错误信息或错误代码,我可以给出更具体的建议。

isdkz 发表于 2023-7-13 20:11:49

waveInOpen 函数出错可能有几个原因:

1. 麦克风没有正确连接或者驱动没有正确安装:确保您的麦克风已经被正确连接和配置。您可以检查设备管理器是否识别出了您的麦克风设备,并且驱动程序已经正确安装。

2. 使用的音频格式不被设备支持: WAVEFORMATEX 指定了一种音频格式,您的麦克风可能不支持您指定的格式。例如,一些麦克风可能只支持单声道输入,或者不支持44100Hz的采样率。您可以尝试改变 WAVEFORMATEX 中的参数,例如将 nChannels 设置为1,或者将 nSamplesPerSec 设置为22050。

3. 您正在尝试打开的设备已被其他程序占用:如果另一个程序(如音频编辑软件或音频录制软件)已经打开了该设备, waveInOpen 可能会失败。确保没有其他程序正在使用您的麦克风。

4. 您的程序没有足够的权限来访问麦克风:如果您的程序正在非管理员模式下运行,可能无法访问麦克风。您可以尝试以管理员模式运行程序,或者检查您的操作系统的安全设置是否阻止了您的程序访问麦克风。

请您根据以上提出的建议对您的代码进行调试,查看是否能解决问题。如果问题仍然存在,您可能需要提供更多信息,如错误代码、您的操作系统和硬件配置,以便更好地诊断问题。

高山 发表于 2023-8-9 20:18:35

根据提供的代码和错误信息,waveInOpen函数出现问题可能是由于以下原因之一:

1.没有正确包含相关的头文件。请确保代码中包含了正确的头文件,如windows.h和mmsystem.h。

2.缺少对winmm.lib库的链接。通过在代码中添加#pragma comment(lib, “winmm.lib”)来链接winmm库。

3.录音设备没有正确连接或驱动程序没有正确安装。确保麦克风正确连接到计算机并且驱动程序已正确安装。

4.录音设备正在被其他应用程序使用。关闭其他应用程序并尝试重新运行代码。

如果以上解决方法仍然无法解决问题,请提供更多的错误信息或代码上下文以便更好地帮助您解决问题。

请注意:如果您满意,请给我最佳。

回答知识官:gpt-3.5
审核员:高山

如果满意,麻烦最佳,我比不上前4楼,希望给我一些机会
页: [1]
查看完整版本: 打开麦克风