在複合影像上顯示應用程式提供的點陣圖
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 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 範例 應用程式中示範。
使用點陣圖影像建立簡單動畫
若要建立簡單的動畫點陣圖標誌,請將所有點陣圖「框架」放入單一影像中,如下圖所示。
當您一開始使用IVMRMixerBitmap::SetAlphaBitmap 設定點陣圖時,如果點陣圖位於 HDC 中,請設定VMRALPHABITMAP結構的rSrc欄位,以指定 HDC 內整個點陣圖的大小。 結構的 頂端 和 左 成員會設定為 0,而 右 和 下 成員是點陣圖的寬度和高度。 如果點陣圖位於 DirectDraw 表面,則已知表面的大小,因此不需要在此方法中指定 rSrc。
當您呼叫IVMRMixerBitmap::UpdateAlphaBitmapParameters時,請使用 HDC 和 DirectDraw 點陣圖的rSrc成員,在您想要顯示的影像中指定特定框架或矩形,並在dwFlags成員中設定VMRBITMAP_SRCRECT旗標。
相關主題