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

发布了16 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Hilaph/article/details/105217385
今日推荐