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

Delphi 播放 MP3 背景音樂:MCI 命令完整實現代碼

     編輯:.NET 實例教學

MCI 多媒體控制接口簡介

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 命令詳解

命令常用標誌說明
MCI_OPENMCI_OPEN_ELEMENT, MCI_OPEN_TYPE打開媒體文件/設備
MCI_PLAYMCI_FROM, MCI_TO, MCI_NOTIFY播放,可指定區間、異步通知
MCI_PAUSE-暫停播放
MCI_RESUME-恢復播放
MCI_STOP-停止播放
MCI_SEEKMCI_TO, MCI_SEEK_TO_START/END跳轉位置
MCI_STATUSMCI_STATUS_ITEM查詢狀態 (模式、位置、長度等)
MCI_CLOSE-關閉設備,釋放資源

常見問題與解決

  1. 文件路徑含空格:雙引號包裹 '"C:\My Music\song.mp3"'
  2. 編碼問題:Delphi 2009+ 為 Unicode,確保字符串正確傳遞,必要時用 PAnsiChar
  3. 循環播放:處理 MM_MCINOTIFY 消息,收到 MCI_NOTIFY_SUCCESSFUL 重新 MCI_PLAY
  4. 音量控制:MCI_SETAUDIO 配合 MCI_DGV_SETAUDIO_VOLUME
  5. 多文件播放:每個文件獨立 MCI_OPEN 獲取不同 DeviceID

錯誤碼查詢

function GetMCIErrorString(ErrorCode: Integer): string;
var
  Buffer: array[0..255] of Char;
begin
  mciGetErrorString(ErrorCode, Buffer, 256);
  Result := Buffer;
end;

調用失敗時顯示具體錯誤描述,便於調試。

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