共用方式為


DirectShow 中的數據流概觀

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

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

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

緩衝區、範例和配置器

每個配置器都會建立媒體樣本集區,併為每個樣本配置緩衝區。 每當篩選條件需要以數據填滿緩衝區時,它會呼叫 IMemAllocator::GetBuffer,從配置器要求範例。 如果配置器有任何樣本目前未由另一個篩選使用,GetBuffer 方法會立即傳回範例指標。 如果配置器的所有樣本都正在使用中,此方法會暫停執行,直到一個樣本變得可用為止。 當方法傳回範例時,篩選會將數據放入緩衝區、在範例上設定適當的旗標(通常包括時間戳),並傳遞範例下游。

當渲染過濾器收到樣本時,它會檢查時間戳,並保留樣本,直到過濾圖的參考時鐘指示數據應被渲染為止。 篩選器處理數據後,會釋放樣本。 樣本不會回到配置器的樣本池,直到樣本的參考計數為零,這表示每個過濾器都已釋放樣本。 下方圖片說明此過程。

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

上游濾波器可能會比渲染器早一步執行,換句話說,它可能填滿緩衝區的速度比渲染器消耗得更快。 即便如此,樣本不會提早呈現,因為渲染器會保留每個樣本直到其呈現的時間。 此外,上游篩選不會意外覆寫緩衝區,因為 GetSample 只會傳回未使用中的樣本。 上游篩選可以事先執行的數量取決於配置器集區中的樣本數目。

上圖只顯示一個配置器,但通常每個數據流都有數個配置器。 因此,當轉譯器釋放範例時,它可以有串聯效果。 下圖顯示譯碼器在等候轉譯器釋放範例時,會保留壓縮的視訊畫面。 解析器過濾器也會等待解碼器釋放樣本。

兩個濾器等待範例

當渲染器釋放其範例時,解碼器對 GetBuffer 的暫止呼叫會傳回。 解碼器接著可以解碼壓縮的視訊畫面,並釋放它所持有的範例,藉此解除剖析器的擱置的 GetBuffer 呼叫的封鎖狀態。

篩選圖表中的 數據流