Windows Multimedia 提供多種音訊 API(waveIn/waveOut、DirectSound、Media Foundation),但 MCIWnd 封裝度最高,幾行程式碼即可完成錄音、播放、存檔、開檔,極適合快速原型或簡易工具開發。本文記錄最精簡實作步驟。
// 全域或類別成員
HWND g_hWndMCIWnd = NULL;
// 初始化函數
void CWav3Dlg::OnButtonInit()
{
MCIWndClose(g_hWndMCIWnd); // 關閉舊實例(建議先判斷 NULL)
// 建立 MCIWnd 視窗,最後參數 NULL 表示新建,給路徑則開啟檔案
g_hWndMCIWnd = MCIWndCreate(m_hWnd, AfxGetApp()->m_hInstance,
WS_CAPTION | WS_VISIBLE, NULL);
// 關鍵:指定裝置類型為 "waveaudio" 才能錄音
MCIWndNew(g_hWndMCIWnd, _T("waveaudio"));
}
// 開始錄音
void CWav3Dlg::OnButtonRec()
{
if (MCIWndCanRecord(g_hWndMCIWnd))
MCIWndRecord(g_hWndMCIWnd);
else
AfxMessageBox(_T("無法錄音,請檢查麥克風"));
}
// 停止錄音/播放
void CWav3Dlg::OnButtonRecStop()
{
MCIWndStop(g_hWndMCIWnd); // 同一函數同時停止錄音與播放
}
void CWav3Dlg::OnButtonPlay()
{
if (MCIWndCanPlay(g_hWndMCIWnd)) {
// 可選:指定播放起始位置(毫秒),m_Int 可從滑桿取得
MCIWndSeek(g_hWndMCIWnd, m_Int);
MCIWndPlay(g_hWndMCIWnd);
} else {
AfxMessageBox(_T("無可播放內容"));
}
}
void CWav3Dlg::OnButtonSave()
{
CString strPath;
CFileDialog dlg(FALSE, _T("wav"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("WAV 檔案 (*.wav)|*.wav||"));
if (dlg.DoModal() != IDOK) return;
strPath = dlg.GetPathName();
if (MCIWndCanSave(g_hWndMCIWnd)) {
// MCIWndSave 第二參數傳 -1 理應彈出儲存對話框,但實測常失敗
// 變通方案:先存為暫存檔 "temp.wav" 再複製重命名
MCIWndSave(g_hWndMCIWnd, _T("temp.wav"));
CopyFile(_T("temp.wav"), strPath, FALSE);
DeleteFile(_T("temp.wav"));
} else {
AfxMessageBox(_T("無法儲存"));
}
}
void CWav3Dlg::OnButtonOpen()
{
CString strPath;
CFileDialog dlg(TRUE, _T("wav"), NULL, OFN_HIDEREADONLY,
_T("WAV 檔案 (*.wav)|*.wav||"));
if (dlg.DoModal() != IDOK) return;
strPath = dlg.GetPathName();
MCIWndClose(g_hWndMCIWnd);
g_hWndMCIWnd = MCIWndCreate(m_hWnd, AfxGetApp()->m_hInstance,
WS_CAPTION | WS_VISIBLE, strPath);
// 開啟檔案後無需再呼叫 MCIWndNew
}
// 對話框銷毀或程式結束時
void CWav3Dlg::OnDestroy()
{
MCIWndClose(g_hWndMCIWnd);
g_hWndMCIWnd = NULL;
CDialog::OnDestroy();
}
| 函數 | 用途 |
|---|---|
| MCIWndCreate | 建立/開啟 MCIWnd 視窗 |
| MCIWndNew | 建立新音訊內容(指定裝置類型如 "waveaudio") |
| MCIWndRecord | 開始錄音 |
| MCIWndPlay | 開始播放 |
| MCIWndStop | 停止錄音/播放 |
| MCIWndSeek | 設定播放/錄音位置 |
| MCIWndSave | 儲存音訊檔案 |
| MCIWndCanRecord/Play/Save | 檢查當前狀態是否支援操作 |
| MCIWndClose | 關閉並釋放資源 |
vfw32.lib 並包含 <vfw.h>。MCIWnd 讓音訊錄製播放變得異常簡單,適合工具類、教學類專案快速整合。掌握 Create → New → Record/Play → Save → Close 核心流程,即可輕鬆實作完整錄音機功能。