隨著多媒體技術的普及,如何在應用程式中流暢播放影音檔案成為開發者常見的需求。Microsoft 的 ActiveMovie 控制項(後更名為 Windows Media Player 控制項)內建 MPEG 音視訊解碼器,支援 VCD、AVI、WAV、MID 等多種格式,且提供直觀的右鍵選單控制播放、暫停、停止等功能,極適合快速開發播放器應用。本文將示範在 Visual C++ 6.0 環境下,如何利用 ActiveMovie Control 2.0 實現多媒體檔案的自動連續播放。
波形音訊(.wav)以數位化方式儲存聲音波形,裝置獨立性佳,播放效果一致,但檔案龐大,適合短音效。
MIDI(Musical Instrument Digital Interface)記錄樂器演奏指令而非實際聲音,檔案極小,需聲卡合成器播放,是電腦音樂製作標準。
依紅皮書標準,透過 CD-ROM 讀取,以軌道區分曲目,時間單位為分、秒、幀(1/75 秒),存儲量大。
利用視覺暫留原理,每秒 24 幀以上形成連續動畫。AVI 為微軟制定的 Windows 視訊標準,交錯儲存影音資料流,全螢幕播放需極高磁碟傳輸速度(約 28MB/秒)。
控制項封裝了高層、裝置無關的命令介面,常用函數如下:
Player。選擇曲目、循環播放、關閉)與一個列表方塊 m_list。m_ActiveMovie,按鈕與列表方塊分別對應 m_ChoiceFile、m_Play、m_Close、m_list。void CPlayerDlg::OnChoiceFile()
{
CFileDialog dlg(TRUE, _T("*.*"), NULL, OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT,
_T("所有檔案 (*.*)|*.*||"));
if (dlg.DoModal() == IDOK)
{
POSITION pos = dlg.GetStartPosition();
while (pos)
{
CString path = dlg.GetNextPathName(pos);
m_list.AddString(path);
}
}
}
void CPlayerDlg::OnPlay()
{
SetTimer(1, 500, NULL); // 每 0.5 秒檢查一次
}
void CPlayerDlg::OnTimer(UINT nIDEvent)
{
if (nIDEvent == 1)
{
double pos = m_ActiveMovie.GetCurrentPosition();
// 播放結束或尚未開始(位置為 0 且非播放中)
if (pos == 0.0)
{
int count = m_list.GetCount();
if (count == 0) return;
CString file;
m_list.GetText(0, file); // 取得第一項
m_list.DeleteString(0); // 移除
m_list.AddString(file); // 移至尾端,形成循環
m_ActiveMovie.SetAutoStart(TRUE);
m_ActiveMovie.SetFileName(file);
m_ActiveMovie.Run();
}
}
CDialog::OnTimer(nIDEvent);
}
void CPlayerDlg::OnClose()
{
KillTimer(1);
m_ActiveMovie.Stop();
CDialog::OnCancel();
}
利用上述函數可輕鬆擴充:音量滑桿、播放進度條、靜音、全螢幕切換、播放速度調整等。若需支援更多格式,可改用 DirectShow 或 Media Foundation 架構。
本文展示了以 ActiveMovie 控制項實現多媒體連續播放的完整流程,從專案建立、控制項整合到定時器輪詢播放狀態,代碼簡潔易懂。雖然 ActiveMovie 屬於較早期技術,但其封裝良好、上手快,仍適合教學與簡易播放器原型開發。現代專案建議採用 Windows Media Player 控制項或 Media Foundation 以獲得更佳相容效能。