BCB里用MCI实现简单的录音功能(摘录自BCB Demo)
代码相当简单:
HANDLE m_hMCIWnd=MCIWndCreate(Handle,
HInstance,
WS_CHILD | WS_OVERLAPPED | WS_CAPTION | WS_BORDER |
MCIWNDF_RECORD | MCIWNDF_SHOWALL,
NULL );
MCIWndNew(m_hMCIWnd, "waveaudio");
MCI_WAVE_SET_PARMS set_parms;
set_parms.wFormatTag = WAVE_FORMAT_PCM;
set_parms.wBitsPerSample = 16;
set_parms.nChannels = 1;
set_parms.nBlockAlign = (set_parms.nChannels*set_parms.wBitsPerSample)/8;
set_parms.nSamplesPerSec = 44100;
set_parms.nAvgBytesPerSec = ((set_parms.wBitsPerSample) *
set_parms.nChannels *
set_parms.nSamplesPerSec)/8;
// now send the format changes with MCI_SET
int deviceID=MCIWndGetDeviceID(m_hMCIWnd);
int result = mciSendCommand( deviceID, MCI_SET,
MCI_WAIT
| MCI_WAVE_SET_FORMATTAG
| MCI_WAVE_SET_BITSPERSAMPLE
| MCI_WAVE_SET_CHANNELS
| MCI_WAVE_SET_SAMPLESPERSEC
| MCI_WAVE_SET_AVGBYTESPERSEC
| MCI_WAVE_SET_BLOCKALIGN,
(DWORD)(LPVOID)&set_parms);
MCIWndRecord(m_hMCIWnd); //开始录制
ShowMessage("录音中...");
MCIWndStop(m_hMCIWnd); //录制完毕
MCIWndSave(m_hMCIWnd,L"abc.wav"); //保存
MCIWndClose(m_hMCIWnd);
MCIWndDestroy(m_hMCIWnd);
头文件:#include <vfw.h>
用MediaPlay录音
//---------------------------------------------------------------------------
void __fastcall CreateWav(WORD wChannels, WORD wResolution, long lRate, String strFileName)
{
typedef struct _TWavHeader
{
long rId;
long rLen;
long wId;
long fId;
long fLen;
WORD wFormatTag;
WORD nChannels;
long nSamplesPerSec;
long nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
long dId;
long wSampleLength;
}TWavHeader;
TWavHeader wh;
wh.rId = 0x46464952;
wh.rLen = 36;
wh.wId = 0x45564157;
wh.fId = 0x20746d66;
wh.fLen = 16;
wh.wFormatTag = 1;
wh.nChannels = wChannels;
wh.nSamplesPerSec = lRate;
wh.nAvgBytesPerSec = wChannels * lRate * (wResolution / 8);
wh.nBlockAlign = wChannels * (wResolution / 8);
wh.wBitsPerSample = wResolution;
wh.dId = 0x61746164;
wh.wSampleLength = 0;
int nHandle = FileCreate(strFileName);
FileSeek(nHandle, 0, 0);
FileWrite(nHandle, &wh, sizeof(wh));
FileClose(nHandle);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnStartClick(TObject *Sender)
{
// 开始录音
MediaPlayer1->DeviceType = dtAutoSelect;
CreateWav(2, 16, 44100, "C://Test.wav");
MediaPlayer1->FileName = "C://Test.wav";
MediaPlayer1->Open();
MediaPlayer1->StartRecording();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnEndClick(TObject *Sender)
{
// 结束录音
MediaPlayer1->Stop();
MediaPlayer1->Save();
MediaPlayer1->Close();
}
//---------------------------------------------------------------------------