程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VC實現錄音,放音,保存,打開功能

VC實現錄音,放音,保存,打開功能

編輯:vc教程

  前一段時間寫一個錄音功能的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).

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved