C++ 採集音頻流(PCM裸流)實現錄音功能

與上一篇的「C++ 播放音頻流(PCM裸流)」 點擊打開連接 相對應,本篇是關於用C++實現錄音功能的。一樣是直接建一個win32控制檯程序而後將代碼拷過去改個文件名就能夠用,也能夠下載本人上傳的相關工程,這個工程是用VS2013寫的,若是是較低的版本就呵呵了。點擊打開連接數組

代碼部分以下:緩存

 

[cpp]  view plain  copy
 
  1. #include "stdafx.h"  
  2. #include <stdio.h>    
  3. #include <Windows.h>    
  4. #pragma comment(lib, "winmm.lib")    
  5.   
  6. HWAVEIN hWaveIn;  //輸入設備  
  7. WAVEFORMATEX waveform; //採集音頻的格式,結構體  
  8. BYTE *pBuffer1;//採集音頻時的數據緩存  
  9. WAVEHDR wHdr1; //採集音頻時包含數據緩存的結構體  
  10. FILE *pf;  
  11. int _tmain(int argc, _TCHAR* argv[])  
  12. {  
  13.     HANDLE          wait;  
  14.     waveform.wFormatTag = WAVE_FORMAT_PCM;//聲音格式爲PCM  
  15.     waveform.nSamplesPerSec = 8000;//採樣率,16000次/秒  
  16.     waveform.wBitsPerSample = 16;//採樣比特,16bits/次  
  17.     waveform.nChannels = 1;//採樣聲道數,2聲道  
  18.     waveform.nAvgBytesPerSec = 16000;//每秒的數據率,就是每秒能採集多少字節的數據  
  19.     waveform.nBlockAlign = 2;//一個塊的大小,採樣bit的字節數乘以聲道數  
  20.     waveform.cbSize = 0;//通常爲0  
  21.   
  22.     wait = CreateEvent(NULL, 0, 0, NULL);  
  23.     //使用waveInOpen函數開啓音頻採集  
  24.     waveInOpen(&hWaveIn, WAVE_MAPPER, &waveform,(DWORD_PTR)wait, 0L, CALLBACK_EVENT);  
  25.   
  26.     //創建兩個數組(這裏能夠創建多個數組)用來緩衝音頻數據  
  27.     DWORD bufsize = 1024*100;//每次開闢10k的緩存存儲錄音數據  
  28.     int i = 20;  
  29.     fopen_s(&pf, "錄音測試.pcm", "wb");  
  30.     while (i--)//錄製20左右秒聲音,結合音頻解碼和網絡傳輸能夠修改成實時錄音播放的機制以實現對講功能  
  31.     {  
  32.         pBuffer1 = 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.         waveInPrepareHeader(hWaveIn, &wHdr1, sizeof(WAVEHDR));//準備一個波形數據塊頭用於錄音  
  40.         waveInAddBuffer(hWaveIn, &wHdr1, sizeof (WAVEHDR));//指定波形數據塊爲錄音輸入緩存  
  41.         waveInStart(hWaveIn);//開始錄音  
  42.         Sleep(1000);//等待聲音錄製1s  
  43.         waveInReset(hWaveIn);//中止錄音  
  44.         fwrite(pBuffer1, 1, wHdr1.dwBytesRecorded, pf);  
  45.         delete pBuffer1;      
  46.         printf("%ds  ", i);  
  47.     }  
  48.     fclose(pf);  
  49.   
  50.     waveInClose(hWaveIn);  
  51.     return 0;  
  52. }  
 
from:http://blog.csdn.net/weixinhum/article/details/31155985
相關文章
相關標籤/搜索