wave 采集总结

来源:互联网 发布:主题商店软件下载 编辑:程序博客网 时间:2024/05/22 22:28

http://blog.csdn.net/wangweitingaabbcc/article/details/6928382

 

三、小结
    因此,根据上述结构定义以及格式介绍,很容易编写相应的wav格式解析代码。
这里具体的代码就不给出了。

下面通过对wave的操作进行了解

[cpp] view plaincopyprint?
  1. //  使用wave族函数,需要添加winmm.lib 
  2. // 是否需要加入mmsystem.h看情况 
  3. //这是在头文件中需要添加的变量和函数 
  4. //具体用途会在下面介绍cpp文件时候都用到 
  5. HWAVEIN hWaveIn;  //输入设备 
  6. WAVEFORMATEX waveform; //采集音频的格式,结构体 
  7. BYTE *pBuffer1,*pBuffer2;//采集音频时的数据缓存 
  8. WAVEHDR wHdr1,wHdr2; //采集音频时包含数据缓存的结构体 
  9. static DWORD CALLBACK MicCallback( //消息回掉函数 
  10.   HWAVEIN hWaveIn,  
  11.   UINT  uMsg,  
  12.   DWORD dwInstance,  
  13.   DWORD dwParam1,  
  14.   DWORD dwParam2); 
  15. /////////////////////////////////////以下是cpp文件中的操作 
  16. waveform.wFormatTag = WAVE_FORMAT_PCM;//声音格式为PCM 
  17. waveform.nSamplesPerSec = 16000;//采样率,16000次/秒 
  18. waveform.wBitsPerSample = 16;//采样比特,16bits/次 
  19. waveform.nChannels = 2;//采样声道数,2声道 
  20. waveform.nAvgBytesPerSec = 16000 * 4;//每秒的数据率,就是每秒能采集多少字节的数据 
  21. waveform.nBlockAlign = 4;//一个块的大小,采样bit的字节数乘以声道数 
  22. waveform.cbSize = 0;//一般为0 
  23.   
  24. //使用waveInOpen函数开启音频采集 
  25. MMRESULT mmr = waveInOpen(&hWaveIn,WAVE_MAPPER,&waveform, 
  26.   (DWORD)(MicCallback), DWORD(this), CALLBACK_FUNCTION); 
  27. if(mmr != MMSYSERR_NOERROR) 
  28.   return false
  29. //建立两个数组(这里可以建立多个数组)用来缓冲音频数据 
  30. DWORD bufsize = 8 * 1024; 
  31. pBuffer1 = new BYTE[bufsize]; 
  32. pBuffer2 = new BYTE[bufsize]; 
  33. wHdr1.lpData = (LPSTR)pBuffer1; 
  34. wHdr1.dwBufferLength = bufsize; 
  35. wHdr1.dwBytesRecorded = 0; 
  36. wHdr1.dwUser = 0; 
  37. wHdr1.dwFlags = 0; 
  38. wHdr1.dwLoops = 1; 
  39. wHdr1.lpNext = NULL; 
  40. wHdr1.reserved = 0; 
  41. //将建立好的wHdr1做为备用 
  42. waveInPrepareHeader(hWaveIn,&wHdr1,sizeof(WAVEHDR)); 
  43. wHdr2.lpData = (LPSTR)pBuffer2; 
  44. wHdr2.dwBufferLength = bufsize; 
  45. wHdr2.dwBytesRecorded = 0; 
  46. wHdr2.dwUser = 0; 
  47. wHdr2.dwFlags = 0; 
  48. wHdr2.dwLoops = 1; 
  49. wHdr2.lpNext = NULL; 
  50. wHdr2.reserved = 0; 
  51. //将建立好的wHdr2做为备用 
  52. waveInPrepareHeader(hWaveIn,&wHdr2,sizeof(WAVEHDR)); 
  53. //将两个wHdr添加到waveIn中去 
  54. waveInAddBuffer (hWaveIn, &wHdr1, sizeof (WAVEHDR)) ; 
  55. waveInAddBuffer (hWaveIn, &wHdr2, sizeof (WAVEHDR)) ; 
  56. //开始音频采集 
  57. waveInStart(hWaveIn); 
  58.   
  59. //下面这个是callback函数,对于采集到的音频数据都在这个函数中处理 
  60. DWORD CALLBACK 
  61. CIMAADPCMDlg::MicCallback(HWAVEIN hwavein, UINT uMsg, DWORD dwInstance,DWORD dwParam1, DWORD dwParam2) 
  62. //这个CIMAADPCMDlg就是你的音频采集类 
  63. CIMAADPCMDlg*pWnd = (CIMAADPCMDlg*)dwInstance; 
  64. int re(0); 
  65. switch(uMsg)  
  66.   case WIM_OPEN: 
  67.    TRACE("WIM_OPEN\n"); 
  68.    break
  69.    
  70.   case WIM_DATA: 
  71.    TRACE("WIM_DATA\n"); 
  72.    //这里就是对采集到的数据做处理的地方,我是做了发送处理 
  73.    //((PWAVEHDR)dwParam1)->lpData这就是采集到的数据指针 
  74.    //((PWAVEHDR)dwParam1)->dwBytesRecorded这就是采集到的数据长度 
  75.    re = send(pWnd->sends,((PWAVEHDR)dwParam1)->lpData,((PWAVEHDR)dwParam1)->dwBytesRecorded,0); 
  76.    //处理完了之后还要再把这个缓冲数组加回去 
  77.    //pWnd->win代表是否继续采集,因为当停止采集的时候,只有当所有的 
  78.    //缓冲数组都腾出来之后才能close,所以需要停止采集时就不要再waveInAddBuffer了 
  79.    if(pWnd->win) 
  80.     waveInAddBuffer (hwavein, (PWAVEHDR) dwParam1, sizeof (WAVEHDR)) ; 
  81.    TRACE("%d\n",re); 
  82.    break
  83.    
  84.   case WIM_CLOSE: 
  85.    TRACE("WIM_CLOSE\n"); 
  86.    break
  87.   default
  88.   break
  89. return 0; 
  90. //最后是结束采集 
  91. win = false
  92. //在这里可以等待一定的时间,确保所有缓冲数组全都退出来了 
  93. //也可以在WIM_DATA消息处理中加个计数器,计算全部buffer都 
  94. //退出来了,就可以调用下面的close了 
  95. waveInClose(hWaveIn); 

原创粉丝点击