DirectShow (DirectX Media) 提供高級多媒體管線,自動識別格式(含 MPEG-2),構建過濾器圖。全屏播放核心流程:
#include <ddraw.h>
#include <mmstream.h>
#include <amstream.h>
#include <ddstream.h>
// 核心接口
IDirectDraw* pDD; // DirectDraw 對象
IDirectDrawSurface* pPrimarySurface; // 主表面
IMultiMediaStream* pMMStream; // 多媒體流(最高層接口)
IAMMultiMediaStream* pAMStream; // 進階多媒體流(構建圖用)
HRESULT Init() {
CoInitialize(NULL); // COM 初始化
HRESULT r = DirectDrawCreate(NULL, &pDD, NULL);
pDD->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
pDD->SetDisplayMode(640, 480, 16); // 分辨率、色深
DDSURFACEDESC ddsd = { sizeof(ddsd) };
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
pDD->CreateSurface(&ddsd, &pPrimarySurface, NULL);
return S_OK;
}
HRESULT LoadFromFile(const char* szFileName,
IMultiMediaStream** ppMMStream,
IDirectDraw* pDD) {
// 創建進階流構建器
CoCreateInstance(CLSID_AMMultiMediaStream, NULL, CLSCTX_INPROC_SERVER,
IID_IAMMultiMediaStream, (void**)&pAMStream);
// 字符串轉 Unicode
WCHAR wPath[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, szFileName, -1, wPath, MAX_PATH);
// 初始化流:讀取模式,無圖線程
pAMStream->Initialize(STREAMTYPE_READ, AMMSF_NOGRAPHTHREAD, NULL);
// 添加視頻流(綁定 DirectDraw)
pAMStream->AddMediaStream(pDD, &MSPID_PrimaryVideo, 0, NULL);
// 添加音頻流(默認渲染器)
pAMStream->AddMediaStream(NULL, &MSPID_PrimaryAudio,
AMMSF_ADDDEFAULTRENDERER, NULL);
// 打開文件(自動構建過濾器圖)
pAMStream->OpenFile(wPath, 0);
*ppMMStream = pAMStream; // 返回基礎接口
return S_OK;
}
HRESULT Play() {
IMediaControl* pControl;
pMMStream->QueryInterface(IID_IMediaControl, (void**)&pControl);
return pControl->Run(); // 開始播放
}
HRESULT Stop() {
IMediaControl* pControl;
pMMStream->QueryInterface(IID_IMediaControl, (void**)&pControl);
return pControl->Stop();
}
void Uninit() {
if (pMMStream) pMMStream->Release();
if (pPrimarySurface) pPrimarySurface->Release();
if (pDD) pDD->Release();
CoUninitialize();
}
| 組件 | 角色 | 關鍵點 |
|---|---|---|
| IMultiMediaStream | 統一流容器 | 包含一個或多個媒體流(視頻/音頻/文本) |
| IAMMultiMediaStream | 流構建器 | Initialize/AddMediaStream/OpenFile 構建過濾器圖 |
| MSPID_PrimaryVideo | 視頻流標識 | 綁定 DirectDraw 表面硬件渲染 |
| MSPID_PrimaryAudio | 音頻流標識 | AMMSF_ADDDEFAULTRENDERER 自動添加音頻渲染器 |
| STREAMTYPE_READ | 流類型 | 從文件讀取;另可 STREAMTYPE_WRITE 捕獲 |
| AMMSF_NOGRAPHTHREAD | 標志 | 無獨立圖線程,主線程處理事件 |
DirectShow + DirectDraw 曾是 Windows 全屏視頻播放的標準方案。理解其「流構建 → 表面綁定 → 過濾器圖運行」模式,有助於掌握現代媒體管線架構。遷移新項目請優先選擇 Media Foundation 或 FFmpeg 方案。