MCI 是设备无关性,提供的功能是很强大的。下面是录音程序,比较简单,但现实是不怎么实用的。
// 开始录音按钮
void CTest1Dlg::OnBtnrecord()
{
char szBuf[256];
m_mciOpenParmsa.lpstrDeviceType = "waveaudio"; // 代表是音频wave数据
m_mciOpenParmsa.lpstrElementName = "";
MCIERROR mciErr = mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_OPEN_TYPE, (DWORD)(LPVOID)&m_mciOpenParmsa);
if (mciErr)
{
mciGetErrorString(mciErr, szBuf, 256);
AfxMessageBox(szBuf);
return;
}
MCI_WAVE_SET_PARMS mciWaveSetParms;
mciWaveSetParms.nChannels = 1;
mciWaveSetParms.nBlockAlign = 1;
mciWaveSetParms.nAvgBytesPerSec = 16000;
mciWaveSetParms.nSamplesPerSec = 8000;
mciWaveSetParms.wBitsPerSample = 16;
mciWaveSetParms.wFormatTag = WAVE_FORMAT_PCM; // wave 参数,当然可以不用设置
mciErr = mciSendCommand(m_mciOpenParmsa.wDeviceID, MCI_SET, MCI_WAVE_SET_CHANNELS | MCI_WAVE_SET_SAMPLESPERSEC
| MCI_WAVE_SET_AVGBYTESPERSEC | MCI_WAVE_SET_BLOCKALIGN | MCI_WAVE_SET_BITSPERSAMPLE, (DWORD)(LPVOID)&mciWaveSetParms);
if (mciErr)
{
mciGetErrorString(mciErr, szBuf, 256);
AfxMessageBox(szBuf);
return;
}
MCI_RECORD_PARMS mciRecordParms; // 开始录音,消息MCI_NOTIFY 表示有停止等其它消息,它才会停止录音
mciErr = mciSendCommand(m_mciOpenParmsa.wDeviceID, MCI_RECORD, MCI_NOTIFY, (DWORD)(LPVOID)&mciRecordParms);
if (mciErr)
{
mciGetErrorString(mciErr, szBuf, 256);
AfxMessageBox(szBuf);
return;
}
}
// 停止录音按钮
void CTest1Dlg::OnBtnstoprecord()
{
char szBuf[256];
MCIERROR mciErr = mciSendCommand(m_mciOpenParmsa.wDeviceID, MCI_STOP, 0, 0); // 先停止录音
if (mciErr)
{
mciGetErrorString(mciErr, szBuf, 256);
AfxMessageBox(szBuf);
return;
}
MCI_SAVE_PARMSA mciSaveParm;
mciSaveParm.lpfilename = "D:\\test.wav";
mciErr = mciSendCommand(m_mciOpenParmsa.wDeviceID, MCI_SAVE, MCI_SAVE_FILE, (DWORD)(LPVOID)&mciSaveParm); // 将录音数据保存到文件中
if (mciErr)
{
mciGetErrorString(mciErr, szBuf, 256);
AfxMessageBox(szBuf);
return;
}
mciErr = mciSendCommand(m_mciOpenParmsa.wDeviceID, MCI_CLOSE, 0, 0); // 关闭录音
if (mciErr)
{
mciGetErrorString(mciErr, szBuf, 256);
AfxMessageBox(szBuf);
return;
}
}
大家看下,MCI 录音是不是很简单啊,中间想获取他的某一帧数据是得不到的了。我花了几天时间才看出来的,捶背。 录音的时间越长,占内存就越大,而且内存数据是看不到的,知道保存文件中才可以看到。纳闷吧!!!