沖洗

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

當篩選圖表正在執行時,任意的資料量可以透過圖表移動。 其中一些可能位於佇列中,正在等候傳遞。 有時候,篩選圖表需要儘快移除此擱置的資料,並將它取代為新的資料。 例如,在搜尋命令之後,來源篩選準則會從來源中的新位置產生樣本。 為了將延遲降到最低,下游篩選應該捨棄在 seek 命令之前建立的任何範例。 捨棄樣本的程式稱為 flushing。 它可讓圖形在事件改變正常資料流程時更具回應性。

提取模型會處理排清與推送模型稍有不同。 本文從描述推播模型開始;然後,它會描述提取模型的差異。

排清會在兩個階段中發生。

  • 首先,來源篩選會在下游篩選的輸入針腳上呼叫 IPin::BeginFlush 。 下游篩選會開始拒絕上游的樣本。 它也會捨棄它所持有的任何樣本,並將 BeginFlush 呼叫下游傳送至下一個篩選。
  • 當來源篩選準備好傳送新資料時,它會在輸入針腳上呼叫 IPin::EndFlush 。 這表示下游篩選準則可以接收新的範例。 下游篩選準則會將 EndFlush 呼叫傳送至下一個篩選。

BeginFlush 方法中,輸入針腳會執行下列動作:

  1. 在下游輸入針腳上呼叫 BeginFlush
  2. 拒絕串流資料的任何進一步呼叫,包括 ReceiveEndOfStream
  3. 解除封鎖任何已封鎖的上游篩選準則,以等候篩選準則配置器中的樣本。 某些篩選準則會取消認可其配置器以供此用途使用。
  4. 從封鎖串流的任何等候結束。 例如,當暫停時,轉譯器篩選會封鎖。 它們也會在等候在正確的資料流程時間呈現樣本時封鎖。 篩選準則必須解除封鎖,以便傳遞和拒絕佇列上游的範例。 此步驟可確保所有上游篩選最終都會解除封鎖。

EndFlush 方法中,輸入針腳會執行下列動作:

  1. 等候所有已排入佇列的樣本被捨棄。
  2. 釋放任何緩衝的資料。 此步驟有時可以在 BeginFlush 方法中執行。 不過, BeginFlush 不會與串流執行緒同步處理。 篩選準則不得在 呼叫 BeginFlushEndFlush的呼叫之間處理或緩衝處理任何資料。
  3. 清除任何擱置EC_COMPLETE通知。
  4. 呼叫 EndFlush 下游。

此時,篩選準則可以再次接受範例。 所有樣本保證都比排清還新。

在提取模型中,剖析器篩選會起始排清,而不是來源篩選。 它不僅會在下游篩選上呼叫IPin::BeginFlushIPin::EndFlush,也會在來源篩選的輸出針腳上呼叫IAsyncReader::BeginFlushIAsyncReader::EndFlush。 如果來源篩選有擱置的讀取要求,則會捨棄這些要求。

排清資料