共用方式為


交涉配置器

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayerIMFMediaEngine 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]

當兩個針腳連線時,他們需要交換媒體數據的機制。 這個機制稱為 傳輸。 一般而言,DirectShow 架構與傳輸無關。 兩個篩選條件可同意使用兩者都支援的任何傳輸進行連線。

最常見的傳輸是本機記憶體 傳輸,其中媒體數據位於主要記憶體中。 本機記憶體傳輸有兩種類型,推送模型提取模型。 在推送模型中,來源篩選會使用下游篩選條件上的 IMemInputPin 介面,將數據推送至下游篩選。 在提取模型中,下游篩選會使用來源篩選器輸出釘選上的 IAsyncReader 介面,從來源篩選條件要求數據。 如需這兩個數據流模型的詳細資訊,請參閱 Filter Graph 中的數據流。

在本機記憶體傳輸中,負責設定記憶體緩衝區的物件稱為 設定器。 配置器支援 IMemAllocator 介面。 這兩個針腳都會共用單一配置器。 任一針腳都可以提供配置器,但輸出針腳會選取要使用的配置器。

輸出針腳也會設定配置器屬性,以決定配置器所建立的緩衝區數目、每個緩衝區的大小,以及記憶體對齊方式。 輸出針腳可能會延遲至緩衝區需求的輸入針腳。

IMemInputPin 連線中,配置器交涉的運作方式如下:

  1. 選擇性地,輸出釘選會呼叫 IMemInputPin::GetAllocatorRequirements。 此方法會擷取輸入針腳的緩衝區需求,例如記憶體對齊。 一般而言,除非有好的理由不要,否則輸出針腳應該接受輸入針腳的要求。
  2. 選擇性地,輸出釘選會呼叫 IMemInputPin::GetAllocator。 這個方法會從輸入針腳要求配置器。 輸入針腳會提供一個,或傳回錯誤碼。
  3. 輸出釘選會選取配置器。 它可以使用輸入針腳所提供的一個,或建立自己的 。
  4. 輸出釘選會呼叫 IMemAllocator::SetProperties 來設定設定器屬性。 不過,配置器可能不會接受要求的屬性。 (例如,如果輸入針腳提供配置器,就會發生這種情況。配置器會將實際屬性當做輸出參數傳回 SetProperties 方法。
  5. outpin 會呼叫 IMemInputPin::NotifyAllocator,以通知輸入釘選專案。
  6. 輸入針腳應該呼叫 IMemAllocator::GetProperties,以確認配置器屬性是否可接受。
  7. 輸出針腳負責認可和取消認可配置器。 當串流啟動和停止時,就會發生這種情況。

IAsyncReader 連線中,配置器交涉的運作方式如下:

  1. 輸入針腳會在輸出釘選上呼叫 IAsyncReader::RequestAllocator。 輸入針腳會指定其緩衝區需求,並選擇性地提供配置器。
  2. 輸出釘選會選取配置器。 它可以使用輸入針腳所提供的輸入,如果有的話,或建立自己的。
  3. 輸出針腳會將配置器當做傳出參數傳回 RequestAllocator 方法。 輸入針腳應該檢查配置器屬性。
  4. 輸入針腳負責認可和取消認可配置器。
  5. 在配置器交涉程序期間,任一針腳都可能會使連線失敗。
  6. 如果輸出針腳使用輸入針腳的配置器,它只能使用該配置器將樣本傳遞至該輸入針腳。 擁有的篩選條件不得使用配置器將樣本傳遞至其他針腳。

提供自訂配置器