沖洗
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
當篩選圖表正在執行時,任意的資料量可以透過圖表移動。 其中一些可能位於佇列中,正在等候傳遞。 有時候,篩選圖表需要儘快移除此擱置的資料,並將它取代為新的資料。 例如,在搜尋命令之後,來源篩選準則會從來源中的新位置產生樣本。 為了將延遲降到最低,下游篩選應該捨棄在 seek 命令之前建立的任何範例。 捨棄樣本的程式稱為 flushing。 它可讓圖形在事件改變正常資料流程時更具回應性。
提取模型會處理排清與推送模型稍有不同。 本文從描述推播模型開始;然後,它會描述提取模型的差異。
排清會在兩個階段中發生。
- 首先,來源篩選會在下游篩選的輸入針腳上呼叫 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。 如果來源篩選有擱置的讀取要求,則會捨棄這些要求。
相關主題