Windows MCI (Media Control Interface) 提供設備無關的多媒體播放控制。Delphi 通過 mmsystem 單元調用 MCI 命令實現音頻播放,無需第三方組件。
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, MMSYSTEM; // 關鍵:MCI 定義在此單元
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
mciOpenParms: TMCI_Open_Parms;
m_MCIDeviceID: MCIDEVICEID;
public
end;
var
Form1: TForm1;
procedure TForm1.FormCreate(Sender: TObject);
var
mciPlayParms: MCI_Play_Parms;
ret: Integer;
begin
try
// 1. 打開設備
mciOpenParms.lpstrDeviceType := ''; // 自動檢測類型
mciOpenParms.lpstrElementName := '做你的愛人.mp3'; // 文件路徑 (相對/絕對)
// MCI_OPEN: 打開設備,MCI_OPEN_ELEMENT: 指定文件
ret := mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, DWORD(@mciOpenParms));
if ret <> 0 then
raise Exception.CreateFmt('打開音頻失敗,錯誤碼: %d', [ret]);
m_MCIDeviceID := mciOpenParms.wDeviceID; // 獲取設備 ID
// 2. 設置播放參數
mciPlayParms.dwCallback := Form1.Handle; // 回調窗口句柄 (接收 MM_MCINOTIFY)
mciPlayParms.dwFrom := 0; // 從頭開始
// MCI_PLAY: 播放,MCI_FROM: 指定起始位置,MCI_NOTIFY: 完成時發送消息
ret := mciSendCommand(m_MCIDeviceID, MCI_PLAY, MCI_FROM or MCI_NOTIFY, Integer(@mciPlayParms));
if ret <> 0 then
raise Exception.CreateFmt('播放失敗,錯誤碼: %d', [ret]);
except
on E: Exception do
ShowMessage('音頻初始化錯誤: ' + E.Message);
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if m_MCIDeviceID <> 0 then
begin
mciSendCommand(m_MCIDeviceID, MCI_CLOSE, 0, 0); // 關閉設備釋放資源
m_MCIDeviceID := 0;
end;
end;
| 命令 | 常用標誌 | 說明 |
|---|---|---|
| MCI_OPEN | MCI_OPEN_ELEMENT, MCI_OPEN_TYPE | 打開媒體文件/設備 |
| MCI_PLAY | MCI_FROM, MCI_TO, MCI_NOTIFY | 播放,可指定區間、異步通知 |
| MCI_PAUSE | - | 暫停播放 |
| MCI_RESUME | - | 恢復播放 |
| MCI_STOP | - | 停止播放 |
| MCI_SEEK | MCI_TO, MCI_SEEK_TO_START/END | 跳轉位置 |
| MCI_STATUS | MCI_STATUS_ITEM | 查詢狀態 (模式、位置、長度等) |
| MCI_CLOSE | - | 關閉設備,釋放資源 |
'"C:\My Music\song.mp3"'PAnsiCharMM_MCINOTIFY 消息,收到 MCI_NOTIFY_SUCCESSFUL 重新 MCI_PLAYMCI_SETAUDIO 配合 MCI_DGV_SETAUDIO_VOLUMEMCI_OPEN 獲取不同 DeviceIDfunction GetMCIErrorString(ErrorCode: Integer): string;
var
Buffer: array[0..255] of Char;
begin
mciGetErrorString(ErrorCode, Buffer, 256);
Result := Buffer;
end;
調用失敗時顯示具體錯誤描述,便於調試。