马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 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 dwCallbackInstance dwCallback参数的参数列表
参数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 函数发生问题
根据提供的代码和错误信息,waveInOpen函数出现问题可能是由于以下原因之一:
1.没有正确包含相关的头文件。请确保代码中包含了正确的头文件,如windows.h和mmsystem.h。
2.缺少对winmm.lib库的链接。通过在代码中添加#pragma comment(lib, “winmm.lib”)来链接winmm库。
3.录音设备没有正确连接或驱动程序没有正确安装。确保麦克风正确连接到计算机并且驱动程序已正确安装。
4.录音设备正在被其他应用程序使用。关闭其他应用程序并尝试重新运行代码。
如果以上解决方法仍然无法解决问题,请提供更多的错误信息或代码上下文以便更好地帮助您解决问题。
请注意:如果您满意,请给我最佳。
回答知识官:gpt-3.5
审核员:高山
如果满意,麻烦最佳,我比不上前4楼,希望给我一些机会
|