打开麦克风
本帖最后由 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 函数发生问题
根据你提供的代码,执行时发生错误可能有多种原因。以下是可能的解决方案:
1. 检查设备和权限:确保计算机上已连接麦克风,并且具有适当的权限以访问音频设备。您可以尝试使用其他应用程序(如语音通话软件)测试麦克风是否正常工作。
2. 检查库文件:确保正确链接了所需的库文件。在编译和链接过程中,请确保使用了正确版本的库文件,并将其路径设置正确。
3. 错误处理:在调用waveInOpen函数之后,您可以检查返回的mmre值以获得更多信息。您可以根据错误代码采取相应的措施。例如,如果返回值为MMSYSERR_ALLOCATED,表示资源已被分配,您可以尝试释放相应的资源后再次尝试。
除此之外,如果您能提供更详细的错误信息或错误代码,我可以给出更具体的建议。 waveInOpen 函数出错可能有几个原因:
1. 麦克风没有正确连接或者驱动没有正确安装:确保您的麦克风已经被正确连接和配置。您可以检查设备管理器是否识别出了您的麦克风设备,并且驱动程序已经正确安装。
2. 使用的音频格式不被设备支持: WAVEFORMATEX 指定了一种音频格式,您的麦克风可能不支持您指定的格式。例如,一些麦克风可能只支持单声道输入,或者不支持44100Hz的采样率。您可以尝试改变 WAVEFORMATEX 中的参数,例如将 nChannels 设置为1,或者将 nSamplesPerSec 设置为22050。
3. 您正在尝试打开的设备已被其他程序占用:如果另一个程序(如音频编辑软件或音频录制软件)已经打开了该设备, waveInOpen 可能会失败。确保没有其他程序正在使用您的麦克风。
4. 您的程序没有足够的权限来访问麦克风:如果您的程序正在非管理员模式下运行,可能无法访问麦克风。您可以尝试以管理员模式运行程序,或者检查您的操作系统的安全设置是否阻止了您的程序访问麦克风。
请您根据以上提出的建议对您的代码进行调试,查看是否能解决问题。如果问题仍然存在,您可能需要提供更多信息,如错误代码、您的操作系统和硬件配置,以便更好地诊断问题。 根据提供的代码和错误信息,waveInOpen函数出现问题可能是由于以下原因之一:
1.没有正确包含相关的头文件。请确保代码中包含了正确的头文件,如windows.h和mmsystem.h。
2.缺少对winmm.lib库的链接。通过在代码中添加#pragma comment(lib, “winmm.lib”)来链接winmm库。
3.录音设备没有正确连接或驱动程序没有正确安装。确保麦克风正确连接到计算机并且驱动程序已正确安装。
4.录音设备正在被其他应用程序使用。关闭其他应用程序并尝试重新运行代码。
如果以上解决方法仍然无法解决问题,请提供更多的错误信息或代码上下文以便更好地帮助您解决问题。
请注意:如果您满意,请给我最佳。
回答知识官:gpt-3.5
审核员:高山
如果满意,麻烦最佳,我比不上前4楼,希望给我一些机会
页:
[1]