DirectShow 透過濾鏡圖管理器 (Filter Graph Manager) 連接應用層與驅動層,支援 WDM 攝影機驅動,彈性較高。本文提供最簡單的預覽實作範例。
IGraphBuilder:建立濾鏡圖。ICaptureGraphBuilder2:連接捕獲裝置。IVideoWindow:控制影片視窗(父視窗、樣式、位置、可見)。IMediaControl:控制執行/停止。IMediaEventEx:事件通知(設定通知視窗)。// 建立 Graph Builder 與 Capture Graph Builder CoCreateInstance(CLSID_FilterGraph, ..., IID_IGraphBuilder, &m_pGraph); CoCreateInstance(CLSID_CaptureGraphBuilder2, ..., IID_ICaptureGraphBuilder2, &m_pCapture); // 介面查詢 m_pMC = m_pGraph; m_pVW = m_pGraph; m_pME = m_pGraph; // 事件通知視窗 m_pME->SetNotifyWindow((OAHWND)hWnd, WM_GRAPHNOTIFY, 0); // 連接捕獲建構器 m_pCapture->SetFiltergraph(m_pGraph); // 列舉視訊輸入裝置 ICreateDevEnum -> CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm); pEm->Next(1, &pM, &cFetched); pM->BindToObject(0, 0, IID_IBaseFilter, &pBf); // 加入濾鏡並渲染預覽腳位 m_pGraph->AddFilter(pBf, L"Video Capture"); m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pBf, NULL, NULL); // 設定影片視窗 m_pVW->put_Owner((OAHWND)hWnd); m_pVW->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN); m_pVW->SetWindowPosition(0, 0, 320, 240); m_pVW->put_Visible(OATRUE); // 註冊至 Running Object Table (供 GraphEdit 遠端檢視) GetRunningObjectTable(0, &pROT); CreateItemMoniker(L"!", wszName, &pM); pROT->Register(ROTFLAGS_REGISTRATIONKEEPSALIVE, m_pGraph, pM, &m_dwGraphRegister);
程式碼簡潔,展示 DirectShow 捕獲預覽的標準流程。更進階用法(壓縮、儲存、多裝置)可在此基礎擴充。