交涉配置器
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
當兩個針腳連線時,他們需要交換媒體資料的機制。 此機制稱為 傳輸。 一般而言,DirectShow 架構對於傳輸是中性的。 兩個篩選準則都同意使用兩者支援的任何傳輸進行連線。
最常見的傳輸是本機 記憶體 傳輸,其中媒體資料位於主要記憶體中。 本機記憶體傳輸有兩種類型, 即推送模型 和 提取模型。 在推送模型中,來源篩選會使用下游篩選輸入針腳上的 IMemInputPin 介面,將資料推送至下游篩選。 在提取模型中,下游篩選準則會使用來源篩選輸出針腳上的 IAsyncReader 介面,從來源篩選要求資料。 如需這兩個數據流模型的詳細資訊,請參閱 篩選圖形中的資料流程。
在本機記憶體傳輸中,負責配置記憶體緩衝區的物件稱為 配置器。 配置器支援 IMemAllocator 介面。 這兩個針腳都會共用單一配置器。 任一針腳都可以提供配置器,但輸出針腳會選取要使用的配置器。
輸出針腳也會設定配置器屬性,以決定配置器所建立的緩衝區數目、每個緩衝區的大小,以及記憶體對齊方式。 輸出針腳可能會延遲至緩衝區需求的輸入針腳。
在 IMemInputPin 連線中,配置器交涉的運作方式如下:
- 選擇性地,輸出針腳會呼叫 IMemInputPin::GetAllocatorRequirements。 這個方法會擷取輸入針腳的緩衝區需求,例如記憶體對齊。 一般而言,輸出針腳應該接受輸入針腳的要求,除非有好的理由不要這麼做。
- 選擇性地,輸出針腳會呼叫 IMemInputPin::GetAllocator。 這個方法會從輸入針腳要求配置器。 輸入針腳提供一個,或傳回錯誤碼。
- 輸出針腳會選取配置器。 它可以使用輸入針腳所提供的輸入針腳,或自行建立。
- 輸出針腳會呼叫 IMemAllocator::SetProperties 來設定配置器屬性。 不過,配置器可能不會接受要求的屬性。 (例如,如果輸入針腳提供 allocator.) 配置器傳回實際屬性做為 SetProperties 方法中的輸出參數,就會發生這種情況。
- outpin 會呼叫 IMemInputPin::NotifyAllocator ,以通知選取範圍的輸入針腳。
- 輸入針腳應該呼叫 IMemAllocator::GetProperties ,以確認配置器屬性是否可接受。
- 輸出針腳負責認可和取消配置器。 當串流啟動和停止時,就會發生這種情況。
在 IAsyncReader 連線中,配置器交涉的運作方式如下:
- 輸入針腳會在輸出針腳上呼叫 IAsyncReader::RequestAllocator 。 輸入針腳會指定其緩衝區需求,並選擇性地提供配置器。
- 輸出針腳會選取配置器。 如果有的話,它可以使用輸入針腳所提供的輸入針腳,或建立自己的輸入針腳。
- 輸出針腳會傳回配置器做為 RequestAllocator 方法中的傳出參數。 輸入針腳應該檢查配置器屬性。
- 輸入針腳負責認可和取消配置器。
- 配置器交涉程式期間,任一針腳都可能會失敗連線。
- 如果輸出針腳使用輸入針腳的配置器,它只能使用該配置器將樣本傳遞給該輸入針腳。 擁有的篩選準則不得使用配置器將樣本傳遞至其他針腳。
相關主題