標籤:windows編程 音頻錄製
參考文檔:
1:github上的一個開原始碼:點擊開啟連結,因為儲存音頻需要自己寫檔案頭部,所以這裡借鑒了它的檔案儲存體功能。
2:一個很有用的文章代碼:點擊開啟連結,雖然有點小瑕疵,但是下面有解答。
3:一個說明類的部落格:點擊開啟連結
這裡加一些說明:windows下多線程盡量用_beginthreadex而不是CreateThread,網上原因說的很詳細。其次,在關閉錄音時,一定不要對waveIn裝置進行緩衝區操作,要不然容易產生死結。範例程式碼如下:
建立終止拷貝線程的代碼:(上文部落格裡面提示,不能在錄音的回呼函數裡將資料寫到檔案,因此需要建立線程,單獨拷貝)
bool stopRecording(const char *fileName, int nameSize){char *fileNameTrue = (char *)malloc(sizeof(char)* (nameSize+1));strcpy_s(fileNameTrue,nameSize+1, fileName);//終止錄音unsigned threadID;hAudio_Detect_Thread = (HANDLE)_beginthreadex(NULL, 0, &Audio_Detect, fileNameTrue, 0, &threadID);WaitForSingleObject(hAudio_Detect_Thread, INFINITE);CloseHandle(hAudio_Detect_Thread);return true;}
給waveIn裝置更換緩衝模組的代碼,注意緩衝模組最少應該是4個,過少容易造成雜音之類的問題
void processSamples(){if(bRecordingStarted ){waveInUnprepareHeader(hWaveIn, WaveHeaders[iBuffIdx], sizeof(WAVEHDR));iBuffIdx ++;if (iBuffIdx == BUFFERCOUNT){iBuffIdx = 0;}WaveHeaders[iBuffIdxT]->dwBufferLength = WaveBufSize;WaveHeaders[iBuffIdxT]->dwFlags = 0;WaveHeaders[iBuffIdxT]->dwLoops = 0;waveInPrepareHeader(hWaveIn, WaveHeaders[iBuffIdxT], sizeof(WAVEHDR));waveInAddBuffer(hWaveIn, WaveHeaders[iBuffIdxT], sizeof(WAVEHDR));if (iBuffIdxT == BUFFERCOUNT){iBuffIdxT = 0;}}}
寫資料的函數,主要調用了github上的代碼
void writeData(char *name){//停止錄音printf("進入寫的函數裡面了, the name is %s\n", name);bRecordingStarted = false;waveInReset(hWaveIn);int stopcode = waveInStop(hWaveIn);printf("the stopcode is %d\n", stopcode);COutputFile *file = NULL;file = new CWaveOutputFile;if (!file->Create(name, m_waveformin)){printf("初始化就錯誤了\n");}printf("正在寫資料\n");file->WriteData(m_AudioDataPool.lpdata, m_AudioDataPool.dwLength);printf("the length of m_AudioDataPool.length is %d", m_AudioDataPool.dwLength);file->Flush();//釋放資源free(name);free(m_AudioDataPool.lpdata);m_AudioDataPool.lpdata = NULL;m_AudioDataPool.dwLength = 0;}
windows下錄製音頻