API层实现语音录制
API?ãʵÏÖÓïÒôÂ?ÖÆ
ÎÒ?ÓÇ??öÓÚÐèÒª??ÉÏÍøÑ?ÕÒÁË?ØÓÚÂ?Òô???ÖµÄÔ??úÂë??ÊÕ?ñ???ó??ÏÖÔÚ?Ñ×Ô?ºÃþË?µÄ???ÖÔ??úÂë???ª?öÀ??É??Ï?Íû?Ô???ÖÈËÓÐÓÃ??
ÆäʵҪʵÏÖÉùÒôµÄÂ?ÖÆ???ÉÒÔÓÃ?àÖÖµÄ??Ê?(ÀýÈç
mci )??ÎÒÕâÀï?éÉܵÄÊÇÔÚ API
µÄ?ãÃæÀ?ʵÏÖ??Äã?ÉÒÔ?ÔÆäÖÐ?øÐÐ?ü?àµÄ?ØÖÆ???È??˵??ÒªÒôƵÂãÊý?Ý?æµ?ÄãÖ???µÄÄÚ?æÖÐÈ???
ÏÈ˵Ò?ÏÂÒªÓõ?µÄ API ?? Â?ÒôÍ?????ÊÇÊ?Óà waveInXXX Ò?Àà API µÄ??×îÖ?ÒªµÄÊÇ waveInStart (?ËÃûË?Òå?ÍÊÇ?ªÊ?Â?Òô)??È?ºóÊÇ waveInStop(ËüÄÜ??ÔÚÄãÖ???µÄ?º?åÂúµÄÊ?ºò?µ?Ø) ?? Èç?û??Óà waveInStop ?ÉÒÔÊ?ÓÃ
waveInReset(??Í?ÓÚStopµÄÊÇ?ú?Êý??µÈ?º?åÂú?ÍÂíÉÏ?µ?ØÄÇÑùÄã?Å?ÉÒÔÖÕÖ?Â?Òô)?????ý×îºÃ?ú waveInGetPosition ÅäºÏÊ?ÓÃ??
˵ÍêÕâÐ?º?Êý????µÃ??ÌáµÄÊÇΪÒÔÉÏ???öº?Êý×ö×?????×?µÄº?Êý(×?ÒâÅä?ÔÊ?ÓÃ)?? waveInOpen ºÍ waveInClose Åä?Ô( waveInOpen
ÀïÃæÖ???ÒôƵµÄ?ñÊ????È??˵Á?ÌåÉù ºÍ16Î?ÒôÖʵÈ)??
waveInPrepareHeader ºÍ waveInUnprepareHeader
Åä?Ô( waveInPrepareHeader
ÀïÃæÖ???ÓÃÀ?Â?Òô?º?åµÄ?óÐ?ºÍÊ×µØÖ?)???ô?ú×Å
waveInPrepareHeaderÒªÀýÐÐ??ʵ?ÓÃ
waveInAddBuffer( ×?ÓÃÎ?Ïê?????à˵ÁË)??
ÏêÏ?µ?ÓÃ?ý?Ì?ÉÒÔ??ÏÂÃæ
(Ö?Ç?×îºÃµ?Óà waveInGetNumDevs ????ÓÐÃ?ÓÐ?ÉÓõÄÉè??)
waveInOpen (?Ã??Óà WAVEFORMATEX ?á??Ö???ÒôƵ?ñÊ?)
waveInPrepareHeader (?Ã??Óà WAVEHDR ?á??µÄ lpData ?ÉÔ?Ö????º?åÊ×µØÖ?)
waveInAddBuffer
waveInStart
(Â?ÖÆÖÐ....)
waveInStop (warning:Ò???Òª?º?åÂúÁË?Å?µ?Ø)
waveInUnprepareHeader
waveInClose
ÐèÒªÖ??öµÄÊÇ??ÉÏÃæµÄ?úÂëÄã??ÄÜËæÐÄËùÓûµÄÍ?Ö?Â?Òô?ý?Ì(Èç?ûÄãÖ???µÄ?
º?å?Ç???ó???È??˵×ã??Â?ÒôÒ??öÐ?Ê???ÄÇÃ?Äã?ÍÒª?Ô?ԵĵÈÉÏÒ??öÐ?Ê?)??Èç?ûÏ?ÍûÂíÉÏÍ?Ö???ÇëÊ?ÓÃÏÂÃæµÄ??????
waveInStart
(Â?ÖÆÖÐ....)
(n Ê??äºó??ÓÃ??Ìá?öÍ?Ö?ÇëÇó)
waveInGetPosition (??Áô?ÃÖµ??ÓÃÀ?ÉèÖà WAVEHDR ?á??µÄ dwBytesRecorded ?ÉÔ?)
waveInReset
(ÖØÐÂÉèÖà WAVEHDR ?á??µÄ dwBytesRecorded ?ÉÔ?)
Õû?ö?ý?Ì?ÍÊÇÈç?˵Ä???ä??ÏÂÃæ???ø?öÔ??ÌÐòÒÔÑéÖ???
ÐèҪ˵Ã?Ò?ÏÂ??Õý??Çé?öÏÂÂ?ÒôÒÔºó??×Ü??ºÄ?ѵÄÄÚ?æ(ÒÔ×Ö?ÚËã) ?á???æÔÚWAVEHDR ?á??µÄ dwBytesRecorded
?ÉÔ?ÖÐ???ÉÓõÄÒôƵÂãÊý?ݵ?È??Í?Å?øÄãÖ???µÄÄÚ?æ?º?åÖÐÈ?ÁË??Äã?ó?É???ØµÈ waveInUnprepareHeader ?Í?ÉÒÔÂíÉÏÄÃÀ?ÓÃÁË??
( ???äÒ??öÄÚÈÝ???ÖÂÔ???âÒ?Ï .wav ÎÄ?þµÄÎÄ?þÍ??ñÊ? )
??ÏÂÃæµÄ?á????Ò??ªÊ?µÄ?Ë?ö×Ö?ÚÊÇÒ??ö?á???? µÚÒ??ö ËÄ×Ö?Ú ÊÇ?êÖ????պõÈÓÚ ascii µÄ "RIFF"
??µÚ?þ?öËÄ×Ö?ÚÊÇ×ܵÄÎÄ?þ???È?õÈ?8??Äã?ÉÒÔÑéÖ?Ò?ÏÂ??(?ÎÕÕ16?øÖÆÔÄ?ÁÊý×ÖµÄ????)
?ú×ÅÊǵÚ?þ?öÊý?Ý?á????Õ?12?ö×Ö?Ú??Èç?ûÄãÊÇ?ê×?µÄ wave ?ñÊ?µÄÎÄ?þ??ÄÇÃ??ÍÊÇ?ô?Ó×ÅÁ??ö?êÖ???µÚÒ??öËÄ×Ö?ÚµÄ?êÖ?ÊÇ ascii µÄ "WAVE" ??µÚ?þ?ö ËÄ×Ö?ÚµÄ?êÖ??ÍÊÇ ascii µÄ "fmt
"(×?Òâ??ÓÐÒ??ö?Õ?ñ)??È?ºóÊ?ϵÄËÄ×Ö?ÚÀïÃæ?صÄÊÇ WAVEFORMATEX ?á??µÄ?óÐ?(?ÎÕÕMSDN)??Ó??ÃÊÇ18?ö×Ö?Ú??
È?ºó??µ?È??ÍÊÇ 18?ö×Ö?ÚµÄ WAVEFORMATEX
?á??ÀïÃæµÄÖµ??ÏêÏ?µÄ?Í??˵ÁË??×Ô?º?éÒ?Ï MSDN?? (ÐèÒª×?ÒâµÄÊÇ??Õâ?ö WAVEFORMATEXEX µÄÄ?Ò??ö?ÉÔ?????ÁË?ÉÄܵÄ???ÈÀ??ä)
ÔÚÕâ 18 ?ö×Ö?ÚºóÃæ
(??ÕÕ?ÉÊ?ºòµÄ????)??Ó??ÃÊÇ?ú×ÅÒ??ö8×Ö?ÚµÄ?á??µÄ??È?ºó?ÍÊÇ "ÂãÊý?Ý" µÄ?ªÊ?µØÖ?ÁË??Õâ?Ë×Ö?Ú?á??µÄ?ªÊ?ËÄ×Ö?ÚÊÇ?êÖ???Ó??õÈÓÚ ascii µÄ "data"??È?ºó?ô?ú×ŵÄËÄ×Ö?Ú?ÍÊÇÂãÊý?ݵÄ?óÐ?ÁË??Ò??ÍÊÇ×îÖØÒªµÄ???Ö??
ºÃÁË??Èç?ËÒ?À???Äã?Í?ÉÒԵõ?ÒôƵÂãÊý?ݵÄÆðÊ?Î?ÖÃ(?ô?ô?úÔÚº?"data"?êÖ?µÄÊý?Ý?á??µÄºóÃæ)????ÓÐ?ÍÊÇÒôƵÊý?ݵÄ???ÈÁË??Ó??ÃÊÇËùÓеÄÎÊÌâ??ºÜÈÝÒ×?â?öµÄ??
???ý????Òª×?Òâ???ÍÊÇÏÖÔڵĺÜ?à .wav
ÎÄ?þ???áÍâ?ÓÒ??öÊý?Ý?á??(12×Ö?Ú)???Í?åÔÚ WAVEFORMATEX µÄºóÃæºÍ º? "data" µÄÊý?Ý?á??Ç?Ãæ?? Õâ?öÍâ?ÓµÄ?á?? µÚÒ??öËÄ×Ö?ÚÊÇ?êÖ???µÈÓÚ ascii ÂëµÄ "fact"??È?ºóµÚ?þ?öËÄ×Ö?ÚµÄÖµÔÚ?ó???ÖÇé?öÏÂ??µÈÓÚ 4?? µÚÈý?öËÄ×Ö?ÚµÄÖµÒ?ÊǵÈÓÚ ÒôƵÂãÊý?ݵÄ???È?? ?ù??ÉÏ?ÍÊÇÕâÑùÁË??
ÏÂÃæ?ø?öµÄÔ??ÌÐòÎÄ?þÖ?Òª?Ó?øÐÂ??µÄ VC
win32???ÌÖÐ???àÒë???É??Ö?ÐÐÐ??ûÊÇÂ?ÒôÈýÃëºó×Ô??Éú?É mytest.wav ÎÄ?þ?????Å?âÊÔ(?ǵÃÑ?ºÃÄ?ÈÏÂ?ÒôÍ?µÀ)??
?Ï?????à˵???ø?öÔ??ÌÐò(?ÃÔ??ÌÐòÖÐÒª?üº?
RunTimeLog.cpp???û) Ï?Íû?Ô?ó?ÒÓÐÓÃ??(È?ÎÄÍê)
(È?ÎÄÍê - 2003Äê03ÔÂ27ÈÕ_am: 11Ê?27?Ö)
// ******************* FileName: WinMain.cpp
*****************************
// ?ÃÔ??ÌÐòÐèÒª?ÓÈëµ? VC6 µÄ Win32 Application µÄ empty Project ÖÐ // Çë?üº?ÎÒ×Ô??ÒåµÄµ?ÊÔÀà???û #include "RunTimeLog.cpp" // ?ÔÓÚ???ÌµÄ Link Ñ?Ïî??ÖÁÉÙÒª?üº?ÒÔÏÂ?â: msvcrt.lib kernel32.lib user32.lib Winmm.lib
#define WIN32_LEAN_AND_MEAN // Say No to MFC !!
#include
#include
#include "RunTimeLog.cpp"
RunTimeLog log;
char lpTemp[256]="";
DWORD FCC(LPSTR lpStr)
{
DWORD Number = lpStr[0] + lpStr[1] *0x100 + lpStr[2] *0x10000 + lpStr[3] *0x1000000 ;
return Number;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
CreateMutex( NULL, false, "MyMutex");
if ( GetLastError() == ERROR_ALREADY_EXISTS )
{ log.write("Exists and Exit"); log.last(); ExitProcess( NULL); }
log.write("Program Start.");
log.nobuff = true;
DWORD datasize = 48000;
// ×î??ÓÃ??
WAVEFORMATEX waveformat;
waveformat.wFormatTag=WAVE_FORMAT_PCM;
waveformat.nChannels=1;
waveformat.nSamplesPerSec=8000;
waveformat.nAvgBytesPerSec=8000;
waveformat.nBlockAlign=1;
waveformat.wBitsPerSample=8; //Ö???Â?Òô?ñÊ?
waveformat.cbSize=0;
wsprintf( lpTemp, "WAVEFORMATEX size = %lu", sizeof(WAVEFORMATEX) );
log.write(lpTemp);
HWAVEIN m_hWaveIn;
if ( waveInGetNumDevs() ) log.write("ÓÐ?ÉÒÔÊ?ÓÃµÄ WaveIn Í?µÀ"); else log.write("Ã?ÓÐ?ÉÒÔÊ?ÓÃµÄ waveIn Í?µÀ");
int res=waveInOpen(&m_hWaveIn,WAVE_MAPPER, &waveformat, (DWORD)NULL,0L,CALLBACK_WINDOW); //?ò?ªÂ?ÒôÉè??
if ( res == MMSYSERR_NOERROR ) log.write("?ò?ª waveIn ?É??"); // ÑéÖ?????ÊÇ?ñ?É??
else {
wsprintf(lpTemp, "?ò?ª waveIn Í?µÀÊ??Ü??Error_Code = 0x%x", res );
log.write(lpTemp);
} // End of ÑéÖ?????ÊÇ?ñ?É??
WAVEHDR m_pWaveHdr;
m_pWaveHdr.lpData = (char
*)GlobalLock( GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, datasize) );
memset(m_pWaveHdr.lpData, 0, datasize );
m_pWaveHdr.dwBufferLength = datasize;
m_pWaveHdr.dwBytesRecorded = 0;
m_pWaveHdr.dwUser = 0;
m_pWaveHdr.dwFlags = 0;
m_pWaveHdr.dwLoops = 0;
wsprintf( lpTemp, "WAVEHDR size = %lu", sizeof(WAVEHDR) );
log.write(lpTemp);
int resPrepare = waveInPrepareHeader( m_hWaveIn, &m_pWaveHdr, sizeof(WAVEHDR) ); //×???ÄÚ?æ?éÂ?Òô
if ( resPrepare == MMSYSERR_NOERROR)
log.write("×???Â?ÒôÓÃÍ?ÎÄ?þ?É??");
else {
wsprintf(lpTemp, "??ÄÜ?ª?ÙÂ?ÒôÍ?ÎÄ?þ??Error_Code = 0x%03X", resPrepare );
log.write(lpTemp);
} // End of ÑéÖ??ª?Ù?º?å
resPrepare = waveInAddBuffer( m_hWaveIn, &m_pWaveHdr, sizeof(WAVEHDR) );
if ( resPrepare == MMSYSERR_NOERROR)
log.write("×???Â?ÒôÓÃÄÚ?æ?É??");
else {
wsprintf(lpTemp, "??ÄÜ?ª?ÙÂ?ÒôÓÃ?º?å??Error_Code = 0x%03X", resPrepare );
log.write(lpTemp);
} // End of ÑéÖ??ª?Ù?º?å
log.write(""); // Ð?Èë?Õ×Ö?û???ÉÒÔ?ÖÐÐ
if (! waveInStart(m_hWaveIn) ) log.write("?ªÊ?Â?Òô"); else log.write("?ªÊ?Â?ÒôÊ??Ü");
Sleep(3200);
MMTIME mmt;
mmt.wType = TIME_BYTES;
log.numberwrite( "sizeof(MMTIME) =", sizeof(MMTIME) ); log.numberwrite( "sizeof(UINT) =", sizeof(UINT) );
if ( waveInGetPosition(m_hWaveIn, &mmt, sizeof(MMTIME)) ) log.write("??ÄÜÈ?µÃÒôƵ???È");
else log.numberwrite( "È?µÃÏÖÔÚÒôƵÎ?Öà =", mmt.u.cb );
if (mmt.wType == TIME_BYTES) { log.write("µÃµ?µÄ TIME_BYTES ?ñÊ?µÄÒôƵ???È"); }
else log.write("Ö???µÄ TIME_BYTES ?ñÊ?ÒôƵ???È??Ö??Ö");
// if (! waveInStop(m_hWaveIn) ) log.write("Í?Ö?Â?Òô"); else log.write("Í?Ö?Â?ÒôÊ??Ü");
if (! waveInReset(m_hWaveIn) ) log.write("ÖØÖÃÄÚ?æÇø?É??"); else log.write("ÖØÖÃÄÚ?æÇøÊ??Ü");
m_pWaveHdr.dwBytesRecorded = mmt.u.cb;
DWORD NumToWrite=0; DWORD dwNumber = 0;
HANDLE FileHandle =
CreateFile( "myTest.wav", GENERIC_WRITE, FILE_SHARE_READ, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// memset(m_pWaveHdr.lpData, 0, datasize);
dwNumber = FCC("RIFF");
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = m_pWaveHdr.dwBytesRecorded + 18 + 20;
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = FCC("WAVE");
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = FCC("fmt ");
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = 18L;
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
WriteFile(FileHandle, &waveformat, sizeof(WAVEFORMATEX), &NumToWrite, NULL);
dwNumber = FCC("data");
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = m_pWaveHdr.dwBytesRecorded;
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
WriteFile(FileHandle, m_pWaveHdr.lpData, m_pWaveHdr.dwBytesRecorded, &NumToWrite, NULL);
SetEndOfFile(FileHandle);
CloseHandle( FileHandle ); FileHandle = INVALID_HANDLE_VALUE; // ÊÕÎ??Ø?Õ?ä?ú
log.write("Ó??ÃÒÑÉú?É myTest.wav ÎÄ?þ");
if ( waveInUnprepareHeader(m_hWaveIn, &m_pWaveHdr, sizeof(WAVEHDR)) ) log.write("Un_Prepare Header Ê??Ü"); else log.write("Un_Prepare Header ?É??");
if ( GlobalFree(GlobalHandle( m_pWaveHdr.lpData )) ) log.write("Global Free Ê??Ü"); else log.write("Global Free ?É??");
if (res == MMSYSERR_NOERROR ) //?Ø?ÕÂ?ÒôÉè??
if
(waveInClose(m_hWaveIn)==MMSYSERR_NOERROR)log.write("Õý???Ø?ÕÂ?ÒôÉè??");
else log.write("?ÇÕý???Ø?ÕÂ?ÒôÉè??");
log.last(true);
// ExitProcess(0);
return 0;
}
// ******************* End of File *****************************
[À?Ô?:programfan.com(?à?Ì??ºÃÕß)][Ñ?È?:kjkimberly]
本文档为【API层实现语音录制】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。