與上一篇的“C++ 播放音頻流(PCM裸流)” 點擊開啟連結 相對應,本篇是關於用C++實現錄音功能的。同樣是直接建一個win32控制台程式然後將代碼拷過去改個檔案名稱就可以用,也可以下載本人上傳的相關工程,這個工程是用VS2013寫的,如果是較低的版本就呵呵了。點擊開啟連結
代碼部分如下:
#include "stdafx.h"#include <stdio.h> #include <Windows.h> #pragma comment(lib, "winmm.lib") HWAVEIN hWaveIn; //輸入裝置WAVEFORMATEX waveform; //採集音訊格式,結構體BYTE *pBuffer1;//採集音頻時的資料緩衝WAVEHDR wHdr1; //採集音頻時包含資料緩衝的結構體FILE *pf;int _tmain(int argc, _TCHAR* argv[]){HANDLE wait;waveform.wFormatTag = WAVE_FORMAT_PCM;//聲音格式為PCMwaveform.nSamplesPerSec = 8000;//採樣率,16000次/秒waveform.wBitsPerSample = 16;//採樣位元,16bits/次waveform.nChannels = 1;//採樣聲道數,2聲道waveform.nAvgBytesPerSec = 16000;//每秒的資料率,就是每秒能採集多少位元組的資料waveform.nBlockAlign = 2;//一個塊的大小,採樣bit的位元組數乘以聲道數waveform.cbSize = 0;//一般為0wait = CreateEvent(NULL, 0, 0, NULL);//使用waveInOpen函數開啟音頻採集waveInOpen(&hWaveIn, WAVE_MAPPER, &waveform,(DWORD_PTR)wait, 0L, CALLBACK_EVENT);//建立兩個數組(這裡可以建立多個數組)用來緩衝音頻資料DWORD bufsize = 1024*100;//每次開闢10k的緩衝儲存錄音資料int i = 20;fopen_s(&pf, "錄音測試.pcm", "wb");while (i--)//錄製20左右秒聲音,結合音頻解碼和網路傳輸可以修改為即時錄音播放的機制以實現對講功能{pBuffer1 = new BYTE[bufsize];wHdr1.lpData = (LPSTR)pBuffer1;wHdr1.dwBufferLength = bufsize;wHdr1.dwBytesRecorded = 0;wHdr1.dwUser = 0;wHdr1.dwFlags = 0;wHdr1.dwLoops = 1;waveInPrepareHeader(hWaveIn, &wHdr1, sizeof(WAVEHDR));//準備一個波形資料區塊頭用於錄音waveInAddBuffer(hWaveIn, &wHdr1, sizeof (WAVEHDR));//指定波形資料區塊為錄音輸入緩衝waveInStart(hWaveIn);//開始錄音Sleep(1000);//等待聲音錄製1swaveInReset(hWaveIn);//停止錄音fwrite(pBuffer1, 1, wHdr1.dwBytesRecorded, pf);delete pBuffer1;printf("%ds ", i);}fclose(pf);waveInClose(hWaveIn);return 0;}