首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 使用 MCIWnd 實作錄音、播放、儲存、開啟功能:極簡教學

     編輯:VC 教學

前言:為什麼選 MCIWnd?

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();
}

關鍵 API 速查表

函數用途
MCIWndCreate建立/開啟 MCIWnd 視窗
MCIWndNew建立新音訊內容(指定裝置類型如 "waveaudio")
MCIWndRecord開始錄音
MCIWndPlay開始播放
MCIWndStop停止錄音/播放
MCIWndSeek設定播放/錄音位置
MCIWndSave儲存音訊檔案
MCIWndCanRecord/Play/Save檢查當前狀態是否支援操作
MCIWndClose關閉並釋放資源

注意事項

  • 需連結 vfw32.lib 並包含 <vfw.h>。
  • MCIWnd 內部使用 MCI 指令字串,相容性好但延遲較高,專業音訊應用建議改用 WASAPI/DirectSound。
  • 錄音格式預設為 PCM 44.1kHz 16bit Stereo,可透過 MCI 指令字串調整(較繁瑣)。

結語

MCIWnd 讓音訊錄製播放變得異常簡單,適合工具類、教學類專案快速整合。掌握 Create → New → Record/Play → Save → Close 核心流程,即可輕鬆實作完整錄音機功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved