共用方式為


在複合影像上顯示應用程式提供的點陣圖

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayerIMFMediaEngine 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]

應用程式可以使用 VMR 的混合模式,在視訊矩形中部分或完全顯示 Alpha 混合通道標誌、使用者介面或廣告。 由於混合是由圖形處理器在硬體中執行,因此對視訊串流播放效能的影響最小,而且沒有可偵測到的閃爍或撕裂成品。 應用程式可以視需要變更顯示的頻率影像。 請注意,只有在 DirectShow 篩選圖形處於執行中狀態時,變更才會反映在畫面上。

VMR 會使用其混音器元件,將點陣圖重迭到複合影像上。 使用 VMR-7 時,應用程式必須強制 VMR 載入其混音器,即使只有單一視訊串流也一樣。 VMR-9 不需要這樣做,因為它預設會載入其混音器。

若要將靜態位圖影像與影片串流混合,應用程式會建立 VMR 並將它新增至圖形,然後呼叫 IVMRFilterConfig::SetNumberOfStreams。 傳遞給此函式的值會識別 VMR 應該建立的輸入針腳數目。 應用程式可以指定介於 1 到 MAX_MIXER_STREAMS 之間的任何值;如果應用程式只想要顯示單一視訊串流,則指定值為1是有效的。 雖然 VMR-7 預設有單一輸入針腳,但必須呼叫此方法,才能強制載入其混音器元件。 (VMR-9 會載入其混音器,並預設設定四個針腳。

若要設定位圖,請使用 VMR-7 上的 IVMRMixerBitmap 介面或 VMR-9 介面上的 IVMRMixerBitmap9 介面。

位圖可由 GDI 裝置內容 (hDC) 的句柄或 DirectDraw Surface 介面指定。 如果應用程式希望影像包含內嵌 Alpha 資訊(也稱為每個圖元 Alpha),則必須將影像數據放在 DirectDraw Surface 介面中。 這是因為目前無法使用 GDI 裝置內容放置每圖元 Alpha 資訊。 DirectDraw 介面必須是 RGB32 或 ARGB32,而且最好是系統記憶體介面。 表面維度不需要是 2 的功率。

VMR 可讓應用程式指定映像的位置和整體透明度值。 下列程式代碼示範如何將映像資料向下傳遞至 VMR 以進行後續的混合:

HRESULT BlendApplicationImage( 
  HWND hwndApp,
  IVMRWindowlessControl* pWc,
  HBITMAP hbm
)
{
    LONG cx, cy;
    HRESULT hr;
    hr = pWc->GetNativeVideoSize(&cx, &cy, NULL, NULL);
    if (FAILED(hr))
        return hr;
    
    HDC hdc = GetDC(hwndApp);
    if (hdc == NULL)
    {
        return E_FAIL;
    }
    
    HDC hdcBmp = CreateCompatibleDC(hdc);
    ReleaseDC(hwndApp, hdc);
    
    if (hdcBmp == NULL)
    {
        return E_FAIL;
    }
    
    BITMAP bm;
    if (0 == GetObject(hbm, sizeof(bm), &bm))
    {
        DeleteDC(hdcBmp);
        return E_FAIL;
    }
    
    HBITMAP hbmOld = (HBITMAP)SelectObject(hdcBmp, hbm);
    if (hbmOld == 0)
    {
        DeleteDC(hdcBmp);
        return E_FAIL;
    }
    
    VMRALPHABITMAP bmpInfo;
    ZeroMemory(&bmpInfo, sizeof(bmpInfo) );
    bmpInfo.dwFlags = VMRBITMAP_HDC;
    bmpInfo.hdc = hdcBmp;
    
    // Show the entire bitmap in the top-left corner of the video image.
    SetRect(&bmpInfo.rSrc, 0, 0, bm.bmWidth, bm.bmHeight);
    bmpInfo.rDest.left = 0.f;
    bmpInfo.rDest.top = 0.f;
    bmpInfo.rDest.right = (float)bm.bmWidth / (float)cx;
    bmpInfo.rDest.bottom = (float)bm.bmHeight / (float)cy;
    
    // Set the transparency value (1.0 is opaque, 0.0 is transparent).
    bmpInfo.fAlpha = 0.2f;
    
    IVMRMixerBitmap* pBmp;
    hr = pWc->QueryInterface(IID_IVMRMixerBitmap, (LPVOID *)&pBmp);
    if (SUCCEEDED(hr)) 
    {
        pBmp->SetAlphaBitmap(&bmpInfo);
        pBmp->Release();
    }
    
    DeleteObject(SelectObject(hdcBmp, hbmOld));
    DeleteDC(hdcBmp);
    return hr;
}

本主題中討論的概念示範於 VMRPlayer 範例 範例應用程式中。

使用位圖影像建立簡單動畫

若要建立簡單的動畫位圖標誌,請將所有點陣圖「畫面」放入單一影像中,如下圖所示。

vmr 映射區

當您一開始使用 IVMRMixerBitmap::SetAlphaBitmap設定位陣圖時,如果點陣圖位於 HDC 中,請設定 VMRALPHABITMAP 結構的 rSrc 字段,以指定 HDC 內整個位圖的大小。 結構 頂端 和左 成員會設定為0,而右 成員是位圖的寬度和高度。 如果點圖位於 DirectDraw 表面,則介面的大小是已知的,因此不需要在此方法中指定 rSrc。

當您呼叫 IVMRMixerBitmap::UpdateAlphaBitmapParameters時,請使用 HDC 和 DirectDraw 位圖的 rSrc 成員,在您想要顯示的影像中指定特定框架或矩形,並在 dwFlags 成員中設定 VMRBITMAP_SRCRECT 旗標。

使用 VMR 混合模式