Intelligent Connect
[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
Intelligent Connect 是 Filter Graph Manager 用來建置篩選圖形的機制。 它是由數個相關演算法所組成,這些演算法會選取篩選,並將其新增至篩選圖表。
如果您無法建置特定篩選圖表並想要針對問題進行疑難解答,或者您正在撰寫自己的篩選,並想要讓它可供自動建置圖形,請閱讀本主題。
Intelligent Connect 包含下列 IGraphBuilder 方法:
- IGraphBuilder::AddSourceFilter
- IGraphBuilder::Render
- IGraphBuilder::RenderFile
- IGraphBuilder::Connect
IGraphBuilder::AddSourceFilter
IGraphBuilder::AddSourceFilter 方法會新增可轉譯指定檔案的來源篩選。 首先,它會在登錄中尋找,並符合通訊協定(例如 https://
)、擴展名,或一組預先決定的 檢查位元組,這是符合特定模式之檔案中特定位移的位元組。 如需詳細資訊,請參閱 註冊自定義檔案類型。 假設方法找到適當的來源篩選條件,接著會建立該篩選的實例、將它新增至圖形,並使用檔名呼叫篩選的 IFileSourceFilter::Load 方法。
IGraphBuilder::Render
IGraphBuilder::Render 方法會建置圖形的子區段。 它會從未連接的輸出針腳開始,並在下游運作,視需要新增新的篩選。 開始篩選條件必須已經在圖形中。 在每個步驟中,Render 方法會搜尋可連線到上一個篩選的篩選條件。 如果連接篩選器有多個輸出針腳,則數據流可以分支。 當每個數據流都有轉譯器時,搜尋就會停止。 如果 Render 方法卡住,它可能會使用一組不同的篩選來備份並再試一次。
若要連接每個輸出釘選,Render 方法會執行下列動作:
如果針腳支援 IStreamBuilder 介面,Filter Graph Manager 會將整個程式委派給針腳的 IStreamBuilder::Render 方法。 藉由公開此介面,針腳負責建置圖形的其餘部分,並向下到轉譯器。 不過,極少數針腳支持這個介面。
篩選圖形管理員會嘗試使用記憶體中快取的篩選條件,如果有的話。 在整個 Intelligent Connect 程式中,Filter Graph 管理員可能會快取來自程式中先前步驟的篩選。 (另請參閱 動態圖形建置。
如果篩選圖形包含任何未連接輸入針腳的篩選條件,篩選圖形管理員會接著嘗試它們。 您可以強制 Render 方法來嘗試特定篩選,方法是在呼叫 Render之前,將篩選新增至圖形。
從 Windows 7 開始,DirectShow 有特定媒體子類型的慣用篩選清單。 如果轉譯的媒體類型有慣用的篩選,篩選圖形管理員會接著嘗試該篩選。 應用程式可以使用 IAMPluginControl 介面來修改慣用篩選的清單。 清單的變更會影響應用程式的目前進程,並在進程結束之後捨棄。
最後,如果找不到適當的篩選條件,Filter Graph 管理員會使用 IFilterMapper2::EnumMatchingFilters 方法來搜尋登錄。 它會嘗試比對登錄中列出的媒體類型,比對輸出釘選的慣用媒體類型。
每個篩選都會以 優點註冊,,這個數值表示篩選條件相對於其他篩選條件的偏好程度。 EnumMatchingFilters 方法會依優點傳回篩選,最小優點為 MERIT_DO_NOT_USE + 1。 它會忽略篩選條件,其優點為 MERIT_DO_NOT_USE 或更少。 篩選也會分組為 GUID 所定義的類別。 類別本身具有優點,而且 EnumMatchingFilters 方法會忽略任何具有 MERIT_DO_NOT_USE 或更少優點的類別,即使該類別中的篩選條件具有較高的優點值也一樣。
從 Windows 7 開始,DirectShow 有特定媒體子類型的封鎖篩選清單。 篩選圖形管理員會略過此清單上的篩選。 應用程式可以使用 IAMPluginControl 介面來修改封鎖篩選清單。 此清單的變更會影響應用程式的目前進程,並在進程結束之後捨棄。
總結來說,Render 方法會依下列順序嘗試篩選:
- 使用 IStreamBuilder。
- 請嘗試快取的篩選。
- 請嘗試圖表中的篩選。
- Windows 7 或更新版本:如果有的話,請嘗試媒體類型的慣用篩選。
- 在登錄中查閱篩選。
IGraphBuilder::RenderFile
IGraphBuilder::RenderFile 方法會從檔名建置預設播放圖形。 在內部,此方法會使用 AddSourceFilter 來找出正確的來源篩選,並 Render 來建置圖形的其餘部分。
IGraphBuilder::Connect
IGraphBuilder::Connect 方法會將輸出釘選連接到輸入針腳。 此方法會視需要新增中繼篩選,使用 Render 方法所述的演演算法變化:
- 請嘗試篩選條件之間的直接連線,但不含中繼篩選條件。
- 請嘗試快取的篩選。
- 請嘗試圖表中的篩選。
- Windows 7 或更新版本:如果有的話,請嘗試媒體類型的慣用篩選。
- 在登錄中查閱篩選。
相關主題