当前位置:   article > 正文

使用Windows API实现本地音频采集_windows api 录音 csdn

windows api 录音 csdn

Windows API提供了Winmm(Windows多媒体)库,其中包括了音频设备相关的函数,可以用来实现音频设备的枚举和测试。

下面是一个简单的示例代码,演示了如何使用Winmm库中的waveInGetNumDevs()函数来枚举计算机上的音频输入设备数量,并使用waveInOpen()函数打开其中一个设备并进行测试录音。

  1. #include <iostream>
  2. #include <Windows.h>
  3. #include <mmsystem.h>
  4. #pragma comment(lib, "winmm.lib")
  5. void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
  6. {
  7. // 实现录音回调函数
  8. }
  9. int main() {
  10. UINT numDevs = waveInGetNumDevs();
  11. std::cout << "Number of audio input devices: " << numDevs << std::endl;
  12. WAVEFORMATEX format;
  13. format.wFormatTag = WAVE_FORMAT_PCM;
  14. format.nChannels = 1;
  15. format.nSamplesPerSec = 44100;
  16. format.wBitsPerSample = 16;
  17. format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8;
  18. format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
  19. HWAVEIN hWaveIn;
  20. MMRESULT result = waveInOpen(&hWaveIn, WAVE_MAPPER, &format, (DWORD_PTR)waveInProc, NULL, CALLBACK_FUNCTION);
  21. if (result == MMSYSERR_NOERROR) {
  22. std::cout << "Audio input device opened successfully" << std::endl;
  23. // 开始录音
  24. result = waveInStart(hWaveIn);
  25. if (result == MMSYSERR_NOERROR) {
  26. std::cout << "Recording started" << std::endl;
  27. }
  28. else {
  29. std::cerr << "Failed to start recording" << std::endl;
  30. waveInClose(hWaveIn);
  31. return 1;
  32. }
  33. // 停止录音
  34. system("pause");
  35. waveInStop(hWaveIn);
  36. waveInReset(hWaveIn);
  37. waveInClose(hWaveIn);
  38. std::cout << "Recording stopped" << std::endl;
  39. }
  40. else {
  41. std::cerr << "Failed to open audio input device" << std::endl;
  42. return 1;
  43. }
  44. return 0;
  45. }

在这个例子中,waveInGetNumDevs()函数返回了计算机上可用的音频输入设备数量。waveInOpen()函数用于打开音频设备,其中参数WAVE_MAPPER表示使用默认设备,&format指向一个WAVEFORMATEX结构体,描述了所需的音频格式,waveInProc是一个回调函数,用于处理录音数据。然后,waveInStart()函数开始录音,system("pause")函数用于暂停程序,以等待用户手动停止录音。最后,waveInStop()函数停止录音,waveInReset()函数清除录音缓冲区,waveInClose()函数关闭音频设备。

waveInProc是一个回调函数,用于处理录音数据,这个回调函数有五个参数,它们的含义如下:

  • HWAVEIN hwi:表示音频设备的句柄,即与音频设备建立的连接。
  • UINT uMsg:表示回调函数的消息类型,可以是以下值之一:
    • WIM_OPEN:当音频设备已经打开并准备好录音时,发送此消息。
    • WIM_DATA:当音频设备已经采集到音频数据时,发送此消息。
    • WIM_CLOSE:当音频设备已经关闭时,发送此消息。
  • DWORD_PTR dwInstance:一个应用程序定义的32位数值,它在打开音频设备时指定,用于传递应用程序特定的信息。
  • DWORD_PTR dwParam1:当uMsgWIM_OPENWIM_CLOSE时,此参数为0。当uMsgWIM_DATA时,此参数是一个指向WAVEHDR结构体的指针,表示音频数据的头信息。
  • DWORD_PTR dwParam2:当uMsgWIM_OPENWIM_CLOSE时,此参数为0。当uMsgWIM_DATA时,此参数为一个DWORD值,表示已经采集到的音频数据的字节数。

需要注意的是,waveInProc函数是在一个独立的线程中执行的,因此要注意线程安全。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/742513
推荐阅读
相关标签
  

闽ICP备14008679号