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

MCI 媒體控制接口編程指南:命令、設備類型與實戰範例

     編輯:關於C語言

什麼是 MCI

MCI (Media Control Interface) 是 Microsoft 提供的一套多媒體設備與文件的標準高層接口。它屏蔽了底層驅動差異,讓開發者用統一命令控制音頻、視頻、CD、DVD、MIDI 等設備,無需了解硬件細節。但對於高級音視頻處理(如濾鏡、編碼參數精細控制),MCI 能力有限,需轉向 DirectShow 或 Media Foundation。

兩種核心調用方式

方式函數特點適用場景
命令字符串 mciSendString 用類自然語言字符串發送命令,如 "open abc.mp3" VB、腳本語言、快速原型
命令消息 mciSendCommand 結構化參數,類型安全,直接與驅動交互 C/C++ 正式項目

mciSendCommand 簽名

MCIERROR mciSendCommand(
    MCIDEVICEID wDeviceID,  // 設備ID,打開時獲取
    UINT uMsg,              // 命令碼,如 MCI_OPEN, MCI_PLAY
    DWORD dwFlags,          // 標誌,指定參數結構類型
    DWORD dwParam           // 參數結構指針
);

mciSendString 簽名

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。

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