Share via


DirectShow 中的資料流程概觀

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

本節提供 DirectShow 中資料流程運作方式的廣泛概觀。 您可以在檔的其他章節中找到詳細資料。

資料會保留在緩衝區中,這只是位元組陣列。 每個緩衝區都會由稱為 媒體範例的 COM 物件包裝,以實作 IMediaSample 介面。 範例是由另一種類型的物件所建立,稱為配置器,它會實作 IMemAllocator 介面。 配置器會為每個針腳連線指派,雖然兩個以上的針腳連接可能會共用相同的配置器。 下圖說明此程式。

緩衝區、範例和配置器

每個配置器都會建立媒體樣本集區,並為每個樣本配置緩衝區。 每當篩選準則需要以資料填滿緩衝區時,它會藉由呼叫 IMemAllocator::GetBuffer來要求配置器的範例。 如果配置器有任何樣本目前未由另一個篩選準則使用, GetBuffer 方法會立即傳回範例的指標。 如果所有配置器的樣本都正在使用中,方法會封鎖直到樣本變成可用為止。 當方法傳回樣本時,篩選會將資料放入緩衝區、在範例上設定適當的旗標, (通常包括時間戳記) ,以及傳遞範例下游。

當轉譯器篩選收到樣本時,它會檢查時間戳記並保留到樣本,直到篩選圖形的參考時鐘指出應該轉譯資料為止。 篩選轉譯資料之後,它會釋放範例。 除非樣本的參考計數為零,否則樣本不會回到配置器的樣本集區,這表示每個篩選已釋放樣本。 下圖說明此程式。

等候免費媒體範例的解碼器

上游篩選可能會在轉譯器之前執行,也就是說,其填滿緩衝區的速度可能會比轉譯器取用快。 即使如此,樣本也不會提早轉譯,因為轉譯器會保留到其呈現時間為止。 此外,上游篩選不會意外覆寫緩衝區,因為 GetSample 只會傳回未使用中的樣本。 上游篩選可以事先執行的數量取決於配置器集區中的樣本數目。

上圖只會顯示一個配置器,但通常每個資料流程都有數個配置器。 因此,當轉譯器釋放樣本時,它可能會有串聯效果。 下圖顯示解碼器在等候轉譯器釋出樣本時,會保存壓縮的視訊畫面的情況。 剖析器篩選也會等候解碼器釋放範例。

等候範例的兩個篩選

當轉譯器釋放其範例時,解碼器對 GetBuffer 的暫止呼叫會傳回。 解碼器接著可以解碼壓縮的視訊框架,並釋放它所保存的範例,藉此解除封鎖剖析器的擱置 GetBuffer 呼叫。

篩選圖形中的資料流程