智慧型連線
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對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 程式中,篩選圖形管理員可能會快取程式中先前步驟中的篩選。 (另請參閱 Dynamic Graph Building.)
如果篩選圖表包含任何未連接輸入針腳的篩選,篩選圖形管理員會接著嘗試。 您可以在呼叫Render之前,先將該篩選新增至圖形,以強制Render方法嘗試特定篩選。
從 Windows 7 開始,DirectShow 具有特定媒體子類型的慣用篩選清單。 如果轉譯的媒體類型有慣用的篩選,篩選圖形管理員會嘗試下一個篩選。 應用程式可以使用 IAMPluginControl 介面來修改慣用篩選的清單。 清單的變更會影響應用程式的目前進程,並在進程結束時捨棄。
最後,如果找不到適當的篩選,篩選圖表管理員會使用 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 或更新版本:如果有的話,請嘗試媒體類型的慣用篩選。
- 在登錄中查閱篩選準則。
相關主題