共用方式為


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

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對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 混合模式