篩選鏈結
[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 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 方法,如 Dynamic Connection中所述,透過圖形推送數據。 篩選可能也支援推送數據的私人方法。
- 上游篩選必須預期鏈結的狀態會變更。 例如,在上圖中,假設鏈結已停止,但篩選 A 呼叫 IMemInputPin::Receive。 呼叫失敗,且篩選 A 的回應是停止串流。 當應用程式重新啟動鏈結時,它就沒有作用,因為篩選 A 不再串流數據。
- 下游篩選也必須預期鏈結的狀態會變更。 如果沒有,下游篩選條件可能會在等候永遠不會到達的樣本時封鎖。 例如,多任務器 (MUX) 篩選器通常需要來自其所有輸入針腳的數據。 停止一個輸入針腳的數據流可能會封鎖其他數據流的處理。 這可能會導致圖形死結。
- 從鏈結外部篩選到鏈結內篩選的每個針腳連接都應該有自己的配置器,而其他連接不會共用此配置器。 當鏈結變更狀態或從圖形中移除時,配置器可能會取消認可。 如果其他連接使用相同的配置器,就無法再處理範例。
- 除非連接到鏈結的篩選支援動態中斷連線,否則請勿移除鏈結。 一般而言,連線篩選條件支援 IPinConnection 或 IPinFlowControl 介面,但可能會改為支援私人介面。
相關主題