[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、IMFMediaEngine以及媒體基金會中的 音訊/視訊擷取取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
當篩選圖表正在執行時,任意量的數據可以透過圖形移動。 其中一些可能位於佇列中,等待傳遞。 有時候篩選圖表需要儘快移除此擱置的數據,並以新的數據取代它。 例如,在搜尋命令之後,來源篩選會從來源的新位置產生樣本。 為了將延遲降到最低,下游篩選應該捨棄在 seek 命令之前建立的任何範例。 捨棄樣本的程式稱為 排清。 當事件改變一般數據流時,它可讓圖形更具回應性。
提取模型處理方式與推送模型略有不同。 本文首先描述推送模型,然後描述提取模型的差異。
排清會在兩個階段進行。
- 首先,源濾鏡會在下游濾鏡的輸入介面針腳上呼叫 IPin::BeginFlush。 下游篩選會開始拒絕上游的樣本。 它會捨棄所保存的任何樣本,並將 BeginFlush 呼叫傳送至下游的下一個濾鏡。
- 當來源篩選準備好傳送新數據時,它會在輸入釘選上呼叫 IPin::EndFlush。 這會向下游篩選發出其可接收新範例的訊號。 下游篩選器會將 EndFlush 呼叫傳送至下一個篩選器。
在 BeginFlush 方法中,輸入引腳會執行下列動作:
- 在下游輸入接腳上呼叫 BeginFlush。
- 拒絕任何進一步的數據串流呼叫,包括 Receive 和 EndOfStream。
- 解除所有因等候過濾器分配器中的樣本而被封鎖的上游過濾器的封鎖。 某些篩選器會解除配置其配置器,以供此用途使用。
- 結束封鎖串流的任何等候。 例如,暫停時,渲染器的篩選器會阻塞。 它們在等待於正確的流時間渲染樣本時也會阻塞。 過濾器必須解除封鎖,這樣已排入上游的範例才能夠被傳遞或拒絕。 此步驟可確保所有上游篩選最終都會解除封鎖。
在 EndFlush 方法中,輸入引腳會執行下列動作:
- 等候所有已排入佇列的樣本被捨棄。
- 釋放任何緩衝的資料。 此步驟有時可以在 BeginFlush 方法中執行。 不過,BeginFlush 不會與串流線程同步處理。 濾鏡在呼叫 BeginFlush 與呼叫 EndFlush之間不能處理或緩衝任何更多的數據。
- 清除任何未處理的 EC_COMPLETE 通知。
- 呼叫 EndFlush 下游。
現在,過濾器可以再次接受樣本。 所有樣本保證都比沖洗後更新。
在提取模型中,剖析器篩選會起始排清,而不是來源篩選。 它不僅會在下游篩選器上呼叫 IPin::BeginFlush 和 IPin::EndFlush,還會在來源篩選器的 輸出 針腳上呼叫 IAsyncReader::BeginFlush 和 IAsyncReader::EndFlush。 如果來源篩選條件有擱置的讀取要求,則會捨棄這些要求。
相關主題