前一段時間寫一個錄音功能的DLL,找了N久,發現N多例子都非常麻煩!現在功能DLL做完了,總結一下貼出來大家看看.
實現了錄音,放音,打開,保存功能.非常簡單,使用的是MSDN裡面的MCIWnd來實現的.唉~廢話少說了,還是看代碼吧!
用VC建立一個Dialog,加入N個按鈕.我的Dialog叫Wav3是測試用的.所以懶得弄名字了,下面也有一個些名字寫的不怎麼樣.
全局的HWND g_hWndMCIWnd; //因為懶得傳來傳去就全局好了
先是初始化函數
void CWav3Dlg::OnButtonInit()
{
MCIWndClose(g_hWndMCIWnd); //這個是為了打開一個聲音的之前關閉以前的聲音,應該先加一個判斷好了.
g_hWndMCIWnd = MCIWndCreate(this->m_hWnd,::AfxGetApp()->m_hInstance,WS_CAPTION,NULL); //創建句柄要說的是最後一個參數,如果是NULL,就新建一個,如果是一個文件的路徑,就打開它.但是都要使用下面的MCIWndNew來開內存
MCIWndNew(g_hWndMCIWnd,"waveaudio");
}
初始化完了之後馬上就可以錄音了,下面就是錄音函數
void CWav3Dlg::OnButtonRec()
{
if(MCIWndCanRecord(g_hWndMCIWnd)) //這裡是判斷是否可以錄音
{
MCIWndRecord(g_hWndMCIWnd); //錄音就這個函數,很簡單
}
else
{
AfxMessageBox("error #01"); //這個錯誤報告很垃圾的,不建議用,不過測試用還可以.
}
}
錄音開始了,接下來就是停止,不停止還了得~!
void CWav3Dlg::OnButtonRecStop() //這個停止函數不是只可以用在錄音的,播放錄音時也可以使用它來停止.
{
MCIWndStop(g_hWndMCIWnd); //別懷疑,就這麼簡單
}
錄完聲音了,播放試試,這個播放也可以播放從硬盤打開的聲音文件.
void CWav3Dlg::OnButtonPlay()
{
if(MCIWndCanPlay(g_hWndMCIWnd)) //這裡判斷有沒有可以播放的東西
{
MCIWndSeek(g_hWndMCIWnd,m_Int); //說一下這裡吧,這裡是確定從哪裡開始播放.沒有也可以就是從頭開始播放.裡面的m_Int是用來傳入播放開始點的,比如從滑動條上接收一個數字,傳到這裡,就從這裡開始播放了.但這個方法是笨方法!
MCIWndPlay(g_hWndMCIWnd);
}
else
AfxMessageBox("error no wave");
}
最後說說保存吧.
void CWav3Dlg::OnButtonSave()
{
CString m_Path;
CFileDialog wav(FALSE,NULL,NULL,OFN_ALLOWMULTISELECT,"wav File (*.wav)|*.wav");
if(wav.DoModal() == IDOK)
{
m_Path = wav.GetPathName();
}
else
return;
if(MCIWndCanSave(g_hWndMCIWnd))
{
MCIWndSave(g_hWndMCIWnd, "a"); //這裡有點問題要說說了,MSDN裡面寫,這個MCIWndSave可以直接保存文件,第二個參數傳入一個-1就會自動打開保存框給我們選擇,但是我試了N久都沒搞定,(也請高手看看,誰搞定了mail給我一份)它不打開保存框給我,但是返回一個成功值!靠~!還有直接保存為文件,文件名只要大於一位就是亂碼,所以我在這裡繞了一個圈,先保存成一個a,拷貝改名為要保存的文件名,最後在結束裡面刪除掉這個a.
CopyFile("a",m_Path,FALSE);
}
else
AfxMessageBox("error Can`t save");
}
OK,已經完成了!打開就不用說了,直接傳一個文件路徑給初始化的最後一個參數就行了.
還有就是最後在善後的時候不要忘了執行一個MCIWndClose(g_hWndMCIWnd).