DMO 包裝函式篩選
[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
DMO 包裝函式篩選可讓 DirectShow 應用程式在篩選圖表中使用 DirectX 媒體物件 (DMO)。 篩選條件會包裝 DMO 並處理使用 DMO 的所有詳細數據,例如將數據傳入 DMO 和從 DMO 傳遞。 此外,篩選會匯總 DMO,讓應用程式可以查詢 DMO 所公開之任何 COM 介面的篩選。
標籤 | 價值 |
---|---|
篩選介面 | IBaseFilterIDMOWrapperFilterIPersistStream |
輸入釘選媒體類型 | 請參閱備註 |
輸入釘選介面 | IMemInputPinIPinIQualityControl |
輸出釘選媒體類型 | 請參閱備註 |
輸出釘選介面 | IAMStreamConfig、IAMVideoCompression、IMediaPosition、IMediaSeeking、IPin、IQualityControl |
篩選 CLSID | CLSID_DMOWrapperFilter |
屬性頁 CLSID | 沒有屬性頁 |
可執行 | Qasf.dll |
優點 | 請參閱備註 |
篩選類別目錄 | 請參閱備註 |
言論
局限性
DMO 包裝函式具有下列限制:
- 它不支援具有零輸入、多個輸入或零輸出的 DMO。 (它確實支援具有一個輸入和輸出的 DMO。
- 它不支援自定義傳輸。 所有數據傳輸都是透過 IMemInputPin 介面來完成。
- 它不使用 IMediaObjectInPlace 介面;所有處理都是使用 IMediaObject方法完成。
引 腳
針對 DMO 上的每個輸入數據流,篩選條件會建立對應的輸入針腳。 針對每個輸出數據流,它會建立對應的輸出釘選。 每個針腳支持的媒體類型取決於 DMO
編碼器介面
如果 DMO 是視訊編碼器或音訊編碼器,輸出針腳會公開 IAMStreamConfig 介面。 如果 DMO 是視訊編碼器,輸出針腳也會公開 IAMVideoCompression 介面。 在這兩種情況下,如果 DMO 支援 介面,則針腳會委派給 DMO。 否則,針腳會提供自己的實作。
流
篩選條件會使用 IMemInputPin 介面來處理所有串流。 它不支援 IAsyncReader 連線。 只有在從上游接收數據時,篩選條件才會在 DMO 上呼叫 IMediaObject::P rocessOutput。 因此,它不支援具有零輸入數據流的 DMO。
尋求
所有搜尋要求都會通過 DMO 包裝函式上的第一個輸入針腳傳遞至上游篩選。 若為多輸出 DMO,這表示上游篩選條件可能會在應用程式搜尋圖形時收到多個搜尋要求。
優點
DirectShow 會將所有 DMO 指派 MERIT_NORMAL + 0x800的預設優點值。 此值介於 MERIT_NORMAL 與 MERIT_PREFERRED之間。 譯碼器篩選通常具有 MERIT_NORMAL的優點值。 因此,篩選圖表管理員通常會在譯碼器篩選上選取 DMO 譯碼器。 若要覆寫預設值,請在 HKEY_CLASSES_ROOT\CLSID中將登錄專案新增至 DMO 的登錄機碼。 包含名為 「Merit」 的 DWORD 值,其值會指定優點。
類別
DMO 包裝函式篩選不會單獨出現在任何類別中。 當它包裝 DMO 時,它會出現在對應至 DMO 類別的 DirectShow 類別中,其名稱為 DMO。
緩衝區
DMO 包裝函式篩選會將媒體緩衝區傳遞至 DMO,以公開 IMediaBuffer 介面。
在 Windows Vista 或更新版本中,媒體緩衝區也會公開 IServiceProvider 介面。 DMO 可以使用這個介面來取得與緩衝區相關聯的媒體範例指標。 使用服務識別碼 IID_IMediaSample。 影片 DMO 可以使用媒體範例的 IMediaSample2 介面,在範例上設定交錯旗標。 下列程式代碼示範如何取得媒體範例的指標:
IServiceProvider *pSp = NULL;
IMediaSample2 *pSample2 = NULL;
HRESULT hr = S_OK;
hr = pBuffer->QueryInterface(IID_IServiceProvider, (void**)&pSp);
if (SUCCEEDED(hr))
{
hr = pSp->QueryService(
IID_IMediaSample, // Service identifier.
IID_IMediaSample2, // Interface identifier.
(void**)&pSample2
);
if (SUCCEEDED(hr))
{
// Set flags (not shown).
pSample2->Release();
}
pSp->Release();
}
如需個別範例交錯旗標的詳細資訊,請參閱 AM_SAMPLE2_PROPERTIES 結構。
品質管理
如果 DMO 公開 IDMOQualityControl 介面,篩選會將 IQualityControl::Notify 在其輸出釘選上的呼叫轉譯為 IDMOQualityControl::SetNow 呼叫 DMO。 SetNow 的 rtNow 參數會計算為 TimeStamp 和 Late 成員 Quality 結構的成員總和。
在 GraphEdit 中使用 Fiter
在 GraphEdit 中,DMO 包裝函式篩選器不會以自己的名稱顯示。 相反地,每個已註冊的 DMO 都會列在適當的篩選類別之下。 當您透過 [插入篩選] 對話框新增 DMO 時,GraphEdit 會建立 DMO 包裝函式篩選,並將其設定為使用該 DMO。
相關主題