在 DirectShow 編輯服務中選取解碼器
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]
[此 API 不受支援,未來可能會變更或無法使用。]
當 DirectShow Editing Services (DES) 轉譯影片編輯專案時,轉譯引擎會自動選取必要的解碼器。 這可能發生在 IRenderEngine::ConnectFrontEnd 方法內,或在轉譯期間動態發生。
使用者可能會安裝數個解碼器,這些解碼器能夠解碼特定檔案。 當有多個解碼器可用時,DES 會使用 Intelligent Connect 演算法來選取解碼器。
應用程式無法直接指定要使用的解碼器。 不過,您可以透過 IAMGraphBuilderCallback 回 呼介面間接選擇解碼器。 藉由在應用程式中實作此介面,您可以在圖形建置程式期間收到通知,並拒絕圖形中的特定篩選。
首先,實作公開 IAMGraphBuilderCallback 介面的類別:
class GraphBuilderCB : public IAMGraphBuilderCallback
{
public:
// Method declarations (not shown).
};
然後建立 Filter Graph 管理員的實例,並註冊您的類別以接收回呼通知:
// Declare an instance of the callback object.
GraphBuilderCB GraphCB;
// Create the Filter Graph Manager.
CComPtr<IGraphBuilder> pGraph;
hr = pGraph.CoCreateInstance(CLSID_FilterGraph);
if (FAILED(hr))
{
// Handle error (not shown).
}
// Register to receive the callbacks.
CComQIPtr<IObjectWithSite> pSite(pGraph);
if (pSite)
{
hr = pSite->SetSite((IUnknown*)&GraphCB);
}
接下來,建立轉譯引擎,並使用篩選圖形管理員的指標呼叫 IRenderEngine::SetFilterGraph 方法。 這可確保轉譯引擎不會建立自己的 Filter Graph 管理員,而是改用您為回呼設定的實例。
CComPtr<IRenderEngine> pRender;
hr = pRender.CoCreateInstance(CLSID_RenderEngine);
if (FAILED(hr))
{
// Handle error (not shown).
}
hr = pRender->SetFilterGraph(pGraph);
轉譯專案時,會在篩選圖形管理員建立新的篩選之前,立即呼叫應用程式的 IAMGraphBuilderCallback::SelectedFilter 方法。 SelectedFilter方法會接收IMoniker介面的指標,代表篩選準則的 Moniker。 檢查 Moniker,如果您決定拒絕篩選,請從 SelectedFilter 方法傳回失敗碼。
困難的部分是識別哪些 Moniker 代表解碼器,特別是,Monikers 代表您想要拒絕的解碼器。 其中一個解決方案如下:
在轉譯專案之前,請使用 IFilterMapper2::EnumMatchingFilters 方法來建立已註冊為接受所需輸入類型的篩選清單。 針對視訊或音訊壓縮類型,此清單應該對應至一組解碼器。
EnumMatchingFilters方法會傳回 Monikers 的集合。 針對集合中的每個 Moniker,取得 DisplayName 屬性,如 使用篩選對應程式中所述。
儲存顯示名稱的清單,但省略符合您要用於解碼之篩選的顯示名稱。 軟體篩選的顯示名稱的格式如下:
OLESTR("@device:sw:{CategoryGUID}\{FilterCLSID}");
where
CategoryGUID
是篩選類別的 GUID,而且
FilterCLSID
是篩選準則的 CLSID。 若為 DMO,格式相同,但會變更
sw
為dmo
。此清單現在包含輸出所需媒體類型但不是您慣用篩選準則之每個篩選的顯示名稱。
在 SelectedFilter 方法中,取得建議 Moniker 上的 DisplayName 屬性,並針對預存清單進行檢查。 如果顯示名稱符合清單中的專案,請拒絕該篩選。 否則,請傳回S_OK來接受它。
相關主題