所用库:
#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