windows C 調用音頻輸入設備 實現錄音

所用庫:

#include "mmsystem.h"

採集輸入設備音頻


void RecordWave()
{
	//返回系統中的輸入設備數量
	int count = waveInGetNumDevs();
	printf("\n音頻輸入數量:%d\n", count);

	//檢查指定輸入設備特性 參數:輸入設備標識/句柄;結構體指針;結構體大小
	WAVEINCAPS waveIncaps;
	MMRESULT mmResult = waveInGetDevCaps(0, &waveIncaps, sizeof(WAVEINCAPS));
	//WAVEINCAPS 結構體參數:wMid驅動程序標識、wPid輸入設備產品標識、vDriverVersion驅動程序版本號、szPname[MAXPNAMELEN]製造商名稱、dwFormats支持的格式、wChannels支持的聲道數
	printf("\n音頻輸入設備:%s\n", waveIncaps.szPname);
	//MMSYSERR_NOERROR執行成功;MMSYSERR_BADDEVICEID索引越界;MMSYSERR_NODRIVER沒有就緒的設備;不能分配或者鎖定內存
	if (MMSYSERR_NOERROR == mmResult)
	{
		HWAVEIN phwi;
		WAVEFORMATEX pwfx;
		WaveInitFormat(&pwfx, 1, 8000, 8);
		printf("\n請求打開音頻輸入設備");
		printf("\n採樣參數:單聲道 8kHz 8bit\n");
		//打開指定的音頻輸入設備開始錄音 參數:接收打開的音頻輸入設備標識的HWAVEIN結構的指針;指定一個需要打開的設備標識.可以使用WAVE_MAPPER選擇一個按指定錄音格式錄音的設備;一個所需格式進行錄音的指針;指向一個回調函數、打開設備的方法標識
		mmResult = waveInOpen(&phwi, WAVE_MAPPER, &pwfx, (DWORD)(MicCallback), NULL, CALLBACK_FUNCTION);//3

		if (MMSYSERR_NOERROR == mmResult)
		{
			WAVEHDR pwh1;
			char buffer1[10240];
			pwh1.lpData = buffer1;//指向波形格式的緩衝區
			pwh1.dwBufferLength = 10240;//緩衝區的大小
			pwh1.dwUser = 1;//用戶數據
			pwh1.dwFlags = 0;//爲緩衝區提供的信息,在waveInPrepareHeader函數中使用WHDR_PREPARED
			//爲音頻輸入設備準備一個緩衝區 參數:音頻輸入設備句柄;指向WACEHDR結構的指針,標識準備的緩衝區;結構體大小
			mmResult = waveInPrepareHeader(phwi, &pwh1, sizeof(WAVEHDR));//4
			printf("\n準備緩衝區1");

			WAVEHDR pwh2;
			char buffer2[10240];
			pwh2.lpData = buffer2;
			pwh2.dwBufferLength = 10240;
			pwh2.dwUser = 2;
			pwh2.dwFlags = 0;
			mmResult = waveInPrepareHeader(phwi, &pwh2, sizeof(WAVEHDR));//4
			printf("\n準備緩衝區2\n");

			if (MMSYSERR_NOERROR == mmResult)
			{
				//將緩衝區發送給設備,若緩衝區填滿,則不起作用
				mmResult = waveInAddBuffer(phwi, &pwh1, sizeof(WAVEHDR));//5
				printf("\n將緩衝區1加入音頻輸入設備");
				mmResult = waveInAddBuffer(phwi, &pwh2, sizeof(WAVEHDR));//5
				printf("\n將緩衝區2加入音頻輸入設備\n");

				if (MMSYSERR_NOERROR == mmResult)
				{
					//開始進行錄製 參數:設備句柄
					mmResult = waveInStart(phwi);//6
					mmResult = waveInClose(phwi);
					printf("\n請求開始錄音\n");
				}
			}
		}

	}
}
DWORD CALLBACK MicCallback(HWAVEIN hwavein, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
{
	switch (uMsg)
	{
	case WIM_OPEN:
		printf("\n設備已經打開...\n");
		break;

	case WIM_DATA:
		printf("\n緩衝區%d存滿...\n", ((LPWAVEHDR)dwParam1)->dwUser);
		waveInAddBuffer(hwavein, (LPWAVEHDR)dwParam1, sizeof(WAVEHDR));
		break;

	case WIM_CLOSE:
		printf("\n設備已經關閉...\n");
		break;
	default:
		break;
	}
	return 0;
}
void WaveInitFormat(LPWAVEFORMATEX m_WaveFormat, WORD nCh, DWORD nSampleRate, WORD BitsPerSample)
{
	m_WaveFormat->wFormatTag = WAVE_FORMAT_PCM;
	m_WaveFormat->nChannels = nCh;
	m_WaveFormat->nSamplesPerSec = nSampleRate;
	m_WaveFormat->nAvgBytesPerSec = nSampleRate * nCh * BitsPerSample / 8;
	m_WaveFormat->nBlockAlign = m_WaveFormat->nChannels * BitsPerSample / 8;
	m_WaveFormat->wBitsPerSample = BitsPerSample;
	m_WaveFormat->cbSize = 0;
}

播放音頻

void PlayMusic()
{
	int error = mciSendString("open C:\\Users\\Angel\\Desktop\\有多少愛可以重來.mp3 alias myDivece", NULL, 0, NULL);
	if (error == 0)
	{
		mciSendString("play myDivece", NULL, 0, NULL); //播放
	}
}

本文參考了:https://www.jb51.net/article/53858.htm

                     https://www.cnblogs.com/matrix-r/p/3523303.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章