篩選鏈結
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]
篩選鏈結是符合下列條件的篩選序列:
- 鏈結中的每個篩選最多都有一個連接的輸入針腳和一個連接的輸出針腳。
- 可以周遊鏈結中的每個篩選,而不需要在鏈結外部周遊篩選。
例如,在下圖中,篩選 A-B、C–D 和 F–G–H 是篩選鏈結。 F–G-H (F–G 和 G-H) 中的每個子鏈也是篩選鏈結。 篩選鏈結可以包含單一篩選準則,因此篩選 A、B、C、D、F、G 和 H 也是不同的篩選鏈結。 篩選 E 有兩個輸入連接,因此包含篩選 E 的任何篩選序列都不是篩選鏈結。
IFilterChain介面提供下列方法來控制篩選鏈結:
標籤 | 值 |
---|---|
IFilterChain::StartChain | 啟動鏈結。 |
IFilterChain::StopChain | 停止鏈結。 |
IFilterChain::P auseChain | 暫停鏈結。 |
IFilterChain::RemoveChain | 從圖形中移除鏈結。 |
沒有新增鏈結的特定方法。 若要新增鏈結,請使用 IFilterGraph::AddFilter 方法插入新的篩選。 然後呼叫 IGraphBuilder::Connect、 IGraphBuilder::Render或類似的方法來連接篩選。
當圖表執行時,篩選鏈結可以在執行和停止之間切換。 當圖表暫停時,它可以在暫停和停止之間切換。 這些是篩選鏈結可能的唯一狀態轉換。
篩選鏈結指導方針
當您使用 IFilterChain 方法時,請務必確定圖形中的篩選可以支援篩選鏈結作業。 否則,您可能會造成死結或圖形錯誤。 連線到鏈結的篩選必須在鏈結變更狀態之後正確運作。
使用 IFilterChain 的最佳方式是一組專為鏈結設計的篩選。 使用下列指導方針來確保篩選鏈結作業的篩選是安全的。 這些點指的是下圖。
- 在篩選鏈結的狀態變更之前,必須完成篩選鏈結界限上的所有資料處理呼叫。 此規則適用于 IMemInputPin::Receive、 IPin::NewSegment和 IPin::EndOfStream的方法。 鏈結中的篩選必須從對鏈結外部篩選所做的這些方法呼叫傳回;和 鏈結外部的篩選準則必須從鏈結內的篩選所發出的呼叫傳回。
例如,在上圖中,篩選 B 必須完成篩選 A 的任何資料處理呼叫,而篩選 E 必須完成篩選 D 的任何呼叫。如果針腳公開 IPinFlowControl 和 IPinConnection 介面,您可以呼叫 IPinFlowControl::Block 和 IGraphConfig::P ushThroughData 方法,以透過圖形推送資料,如 動態重新連線中所述。 篩選可能也支援用於推送資料的私人方法。
- 上游篩選準則必須預期鏈結的狀態會變更。 例如,在上圖中,假設鏈結已停止,但篩選 A 會呼叫 IMemInputPin::Receive。 呼叫失敗,且篩選 A 的回應是停止串流。 當應用程式重新開機鏈結時,它不會有任何作用,因為篩選 A 不再串流資料。
- 下游篩選也必須預期鏈結的狀態會變更。 如果沒有,下游篩選準則可能會在等候永遠不會送達的樣本時封鎖。 例如,多工器 (MUX) 篩選器通常需要來自其所有輸入針腳的資料。 從一個輸入針腳停止資料流程可能會封鎖其他資料流程進行處理。 這可能會導致圖形死結。
- 從鏈結外部篩選到鏈結內篩選的每個針腳連接都應該有自己的配置器,其他連接不會共用。 當鏈結變更狀態或從圖形中移除時,配置器可能會遭到認可。 如果其他連接使用相同的配置器,他們就無法再處理範例。
- 除非連線到鏈結的篩選支援動態中斷連線,否則請勿移除鏈結。 一般而言,連線的篩選將支援 IPinConnection 或 IPinFlowControl 介面,但可能會改為支援私人介面。
相關主題