MCI (Media Control Interface) 是 Microsoft 提供的一套多媒體設備與文件的標準高層接口。它屏蔽了底層驅動差異,讓開發者用統一命令控制音頻、視頻、CD、DVD、MIDI 等設備,無需了解硬件細節。但對於高級音視頻處理(如濾鏡、編碼參數精細控制),MCI 能力有限,需轉向 DirectShow 或 Media Foundation。
| 方式 | 函數 | 特點 | 適用場景 |
|---|---|---|---|
| 命令字符串 | mciSendString |
用類自然語言字符串發送命令,如 "open abc.mp3" |
VB、腳本語言、快速原型 |
| 命令消息 | mciSendCommand |
結構化參數,類型安全,直接與驅動交互 | C/C++ 正式項目 |
MCIERROR mciSendCommand(
MCIDEVICEID wDeviceID, // 設備ID,打開時獲取
UINT uMsg, // 命令碼,如 MCI_OPEN, MCI_PLAY
DWORD dwFlags, // 標誌,指定參數結構類型
DWORD dwParam // 參數結構指針
);
MCIERROR mciSendString(
LPCTSTR lpszCommand, // 命令字符串
LPTSTR lpszReturnString, // 返回信息緩衝區
UINT cchReturn, // 緩衝區大小
HANDLE hwndCallback // 回調窗口句柄(用於異步通知)
);
打開設備時可用數值常量或字符串別名:
MCI_DEVTYPE_WAVEFORM_AUDIO / "waveaudio" — Wave 音頻MCI_DEVTYPE_CD_AUDIO / "cdaudio" — CD 音頻MCI_DEVTYPE_DIGITAL_VIDEO / "digitalvideo" — 數字視頻MCI_DEVTYPE_SEQUENCER / "sequencer" — MIDI 序列器MCI_DEVTYPE_ANIMATION / "animation" — 動畫MCI_DEVTYPE_VIDEO_DISC / "videodisc" — 激光視盤MCI_DEVTYPE_VCR / "vcr" — 錄像機系統在 system.ini [mci] 區段註冊驅動映射,如 waveaudio=mciwave.drv。第三方驅動(QuickTime、MPEG)亦會在此註冊。
// 1. 自動識別(推薦):根據文件擴展名自動選驅動
MCI_OPEN_PARMS mciOpen = {0};
mciOpen.lpstrElementName = _T("music.mp3");
mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
// 2. 指定設備類型常量
mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO;
mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);
// 3. 指定設備類型字符串
mciOpen.lpstrDeviceType = _T("mpegvideo");
mciOpen.lpstrElementName = _T("movie.mpg");
mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
| 命令 | 功能 | 典型標誌/參數結構 |
|---|---|---|
| MCI_OPEN | 打開設備/文件 | MCI_OPEN_PARMS |
| MCI_CLOSE | 關閉設備 | — |
| MCI_PLAY | 播放 | MCI_PLAY_PARMS (from/to) |
| MCI_PAUSE | 暫停 | — |
| MCI_STOP | 停止 | — |
| MCI_SEEK | 移動播放位置 | MCI_SEEK_PARMS |
| MCI_STATUS | 查詢狀態(模式、位置、長度) | MCI_STATUS_PARMS |
| MCI_SET | 設置屬性(時間格式、音量、速度) | MCI_SET_PARMS |
| MCI_SAVE | 保存文件 | MCI_SAVE_PARMS |
| MCI_RECORD | 開始錄制 | MCI_RECORD_PARMS |
| MCI_GETDEVCAPS | 獲取設備能力 | MCI_GETDEVCAPS_PARMS |
// 打開
MCI_OPEN_PARMS openParms = {0};
openParms.lpstrElementName = _T("bgm.mp3");
mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&openParms);
MCIDEVICEID devID = openParms.wDeviceID;
// 設置時間格式為毫秒
MCI_SET_PARMS setParms = {0};
setParms.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
mciSendCommand(devID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD)&setParms);
// 播放
MCI_PLAY_PARMS playParms = {0};
mciSendCommand(devID, MCI_PLAY, MCI_NOTIFY, (DWORD)&playParms); // 異步,完成發送 MM_MCINOTIFY
// 查詢當前位置
MCI_STATUS_PARMS statusParms = {0};
statusParms.dwItem = MCI_STATUS_POSITION;
mciSendCommand(devID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&statusParms);
DWORD curPos = statusParms.dwReturn; // 毫秒
// 關閉
mciSendCommand(devID, MCI_CLOSE, 0, 0);
所有 MCI 函數返回 MCIERROR(0 表示成功)。可用 mciGetErrorString(errCode, buf, len) 獲取可讀錯誤描述。
MCI 以極簡 API 覆蓋了 90% 的基礎多媒體播控需求,是 Windows 多媒體編程的入門首選。掌握「命令消息」模式配合結構體參數,能編寫健壯、可維護的播放器核心。進階需求請遷移至 DirectShow/Media Foundation。