Microsoft Media Foundation) (流失貯體緩衝區模型

當您透過網路串流媒體時,解碼器會以理論上的常數速率接收編碼的資料, (傳輸速率) 。 解碼器會取用此資料來產生解碼的輸出。 不過,在一般情況下,解碼器會以 可變 速率取用資料,因為編碼器可以使用變數編碼速率。

「流失貯體」模型是建立順暢播放之緩衝需求的模型。 在此模型中,解碼器會維護緩衝區。 編碼的資料會從網路進入緩衝區,以及從緩衝區進入解碼器。 如果緩衝區下溢,表示解碼器從緩衝區中移除資料的速度比網路傳遞快。 如果緩衝區溢位,表示網路會比解碼器取用資料更快。

本主題描述用於編碼和解碼的緩衝區「流失貯體」模型。

外泄貯體

若要瞭解流失貯體模型,請考慮底部有小型漏洞的貯體。 三個參數會定義貯體:

  • B (容量)
  • 流出貯體 (R) 的速率
  • 貯體的初始完整度 (F)

在此隱喻中,貯體是緩衝區:

圖例顯示緩衝區做為貯體、輸入速率做為進入貯體之水,以及輸出速率做為水離開貯體中的空洞

如果水會以完全相同的速率 R將水填入貯體中,則貯體會維持在 F,因為輸入速率等於輸出速率。 如果輸入速率在 R 維持不變時增加,貯體會累積水。 如果輸入速率在持續期間大於 R ,則最後會溢位。 不過,只要平均輸入速率未超過貯體容量,輸入速率可能會隨著 R 而有所不同,而不會溢位。 容量越大,輸入速率在指定的時間範圍內可能會有所不同。

在 ASF 中,流失貯體是由三個參數所定義:

  • 每秒以位元組為單位的平均位元速率,其對應至 R (輸出 速率)
  • 以毫秒為單位的緩衝區視窗,其對應于 B) (貯體容量。
  • 初始緩衝區完整度,通常設定為零。

位元速率會測量編碼資料流程中每秒的平均位數。 緩衝區視窗會以該位速率測量可放入緩衝區的資料毫秒數。 位中的緩衝區大小等於 R * (B / 1000) 。

ASF 承載資料可能會以不規則的時間和不規則的數量進入外泄貯體,但必須將貯體保留為常數正位元速率。 由於緩衝區視窗,承載進入貯體的時間和離開時間之間可能會有延遲。 可能發生的最大延遲是B/R。 進入貯體中的承載資料會根據簡報時間,且絕對不能溢位貯體。 除了呈現時間之外,每個承載也有一個傳送時間,也就是承載資料根據位元速率離開貯體的時間。 傳送時間必須早于簡報時間,以確保當流失貯體接近已滿時,每個承載都會在簡報時間之前或之前離開貯體。 為了達成此目的,簡報時間會由預先註冊) (B/R值向前移動,而傳送時間會從零開始開始。 傳送時間不得晚于簡報時間,因為這表示承載太晚輸入貯體,而且不能包含在資料物件中。 預先註冊值包含在 ASF 標頭物件 中。

若是透過網路進行無問題串流,媒體內容內的壓縮資料流程必須在整個播放期間維持固定的位元速率。 ASF 流失貯體模型可確保以固定位元速率透過網路傳送媒體資料。 外泄貯體的參數是在 ASF 標頭物件的Extended Stream Properties 物件中指定。 在 Microsoft Media Foundation 中,它們是在代表資料流程的媒體類型上設定為屬性。

流失貯體值定義于 ASF 檔案接收和基礎 ASF 多工器物件和 Windows 媒體編碼器中。 這些值可能相同或不同。 例如,請考慮串流案例,這需要比影片範例稍後傳遞音訊樣本,以便不延遲地串流處理檔案。 若要達到此目的,音訊資料流程在媒體接收中的流失值區可以設定為高於 Windows 媒體音訊編碼器中設定的值。

若要在編碼器中設定 B/R 值,應用程式必須設定 MFPKEY_RAVGMFPKEY_BAVGMFPKEY_RMAXMFPKEY_BMAX 屬性。 如需在編碼器中設定屬性的詳細資訊,請參閱 編碼屬性

使用中的貯體

編碼器的目標是確保內容永遠不會溢位緩衝區。 編碼器會使用位元速率和緩衝區視窗值作為輔助線。 在等於緩衝區視窗的任何期間內傳遞的實際位數目永遠不能大於緩衝區的大小兩倍。

請考慮下列範例:您有一個 3 個 3 個貯體,其內含一個孔,每分鐘 1 個單位可以流動。 您會將貯體放在 spigot 底下,並開啟閥,以每分鐘 1 英分的速率讓水流出。 水會隨著貯體進入而快速流出,在貯體中不會有任何額外專案。 然後,您會將流量從 spigot 增加至每分鐘 2 個單位。 水流速率為此速率的每分鐘,2 個冷卻器會進入貯體,而 1 個冷卻器外泄,在貯體中留下 1 個公里。 在 3 分鐘結束時,6 個水溫器已進入貯體,3 個冷卻器已外泄,而貯體已滿。

在實務上,絕對不會達到等於緩衝區視窗之間隔的理論最大資料速率。 上一個範例假設是常數資料速率。 假設有相同的 3-galon 貯體,您可以將流量速率從 spigot 增加為每分鐘 6 個英角一分鐘,然後關閉尖峰兩分鐘。 即使放入貯體的總水量在緩衝視窗的理論最大值內,該數量的濃度仍會導致貯體溢位。 在每分鐘 6 個英毫秒時,3-galon 貯體會在 30 秒過後立即溢位。 因此,任何間隔期間內可傳遞至緩衝區的實際最大資料量等於緩衝區視窗設定,取決於個別樣本的大小和傳遞時間。

到目前為止,範例只會討論解碼器所使用的緩衝區,但編碼器也會使用流失貯體緩衝區來建立壓縮的內容。 編碼器會對壓縮演算法進行任何調整,以在位速率和緩衝區視窗所描述的界限內保留壓縮樣本的位元速率,假設樣本會以固定速率傳遞至解碼器。 您可以將編碼器貯體視為鏡像解碼器貯體。 編碼器貯體會以可變速率填滿,取決於個別樣本的大小,並以等於平均位元速率的常數速率外泄。

請考慮下列透過網路連線的編碼器和解碼器範例。 您會以每秒 30 個畫面格的位元速率編碼視訊檔案,其位元速率為每秒 6,000 位,且緩衝區視窗為 3 秒, (緩衝區大小總計為 18,000 位) 。 第一個範例會編碼為主要畫面格,並佔用 7,000 位。 編碼器緩衝區現在包含 7,000 位。 接下來 29 個畫面都是總計 3,000 位的差異畫面。 因此, (30 個畫面格的第一秒內容) 如果沒有外泄任何內容,則緩衝區完整度會放在 10,000 位。我們知道資料流程的位元速率每秒為 6,000 位,因此在編碼內容的第一秒放入編碼器緩衝區之後,完整性會下降至 4,000 位。 在解碼應用程式中,此資料流程會以每秒 6,000 位傳送至解碼器緩衝區。 一秒之後,緩衝區會包含 6,000 個位。 第一個範例包含 7,000 個位,因此解碼器緩衝區必須在解碼器開始移除樣本之前填入更多位。

設定 ASF 資料流程的流失值區值

在檔案編碼案例中,應用程式可以在 ASF 設定檔中設定資料流程時設定外泄值區值。

建立資料流程並參考資料流的 IMFASFStreamConfig 介面之後,您可以使用下列屬性來設定值:

如需新增資料流程和取得 IMFASFStreamConfig 指標的相關資訊,請參閱 將串流資訊新增至 ASF 檔案接收

這些值包含下列一組資訊:

應用程式所提供的值取決於編碼類型和資料流程的媒體類型。 例如, 常數位元速率編碼 需要預先決定的固定位元速率和緩衝區視窗。 應用程式可以藉由在資料流程上設定 MFPKEY_VIDEOWINDOW 編碼屬性和 MF_ASFSTREAMCONFIG_LEAKYBUCKET1 屬性,來指定這些外泄值區值。 指定的緩衝區視窗值可用來確定編碼的檔案具有在資料封包上標示的正確傳送時間,且預先註冊值會出現在 ASF 標頭物件中。 設定 MF_ASFSTREAMCONFIG_LEAKYBUCKET1 已足夠,因為這些指定的值會複製到 MF_ASFSTREAMCONFIG_LEAKYBUCKET2 屬性中。

針對 2 次編碼模式,您需要設定這兩個屬性來指定平均值和最大值。

針對 VBR 編碼,應用程式只能在編碼階段完成之後,查詢編碼器所使用的外泄值區值。 因此,在設定媒體接收時,應用程式可以選擇不設定與外泄貯體相關的屬性或屬性。 編碼之後,應用程式必須查詢編碼器,以取得 MFPKEY_RAVGMFPKEY_BAVGMFPKEY_RMAXMFPKEY_BMAX 屬性,並在媒體接收中設定這些屬性,讓正確的值反映在 Header 物件中。 如需如何更新 VBR 編碼值的程式碼範例,請參閱教學課程 :1-Pass Windows 媒體編碼中的。

如果您要將 Windows 媒體內容從來源複製到媒體接收,而不需編碼,則必須在媒體接收中設定流失值區值。

ASF 多工器中的流失值區值

在 Media Foundation 中, ASF Multiplexer 會使用外泄貯體值來設定其用來產生資料封包的內部流失值區值。 承載包含在媒體範例中,而一系列媒體範例構成 ASF 資料封包。 根據流失值區值和呈現時間,多工器會為每個媒體範例指派傳送時間,讓透過網路傳送的封包的位元速率 (R) 。

應用程式無法直接在多工器中設定外泄值區值。 必須在 ASF 媒體接收上提供值,以在多工器上設定適當的值。 多工器會使用 在MF_ASFSTREAMCONFIG_LEAKYBUCKET1MF_ASFSTREAMCONFIG_LEAKYBUCKET2 中設定的值,以使用指定的值來驗證傳送至 ASF 媒體接收的樣本。

更新 ASF 媒體接收中的流失值區值

應用程式可以在串流建立期間覆寫在 ASF 設定檔中設定的資料流程層級流失值區 (值,) 方法是在媒體接收的屬性存放區中設定 MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET 屬性。 若要取得屬性存放區的參考,請使用媒體接收所實作的 ContentInfo 物件。 如需詳細資訊,請參閱 在檔案接收中設定屬性

注意 只有音訊資料流程才允許此作業。

在編碼器上設定輸出類型之後,必須設定這個屬性。 根據媒體類型中所設定的位元速率,編碼器會計算緩衝區大小,以確保產生的媒體樣本永遠不會溢位緩衝區。 編碼器會在壓縮期間進行必要的調整,以在位速率和緩衝區視窗所描述的界限內保留壓縮樣本的位元速率。

類似于流失貯體資料流程組態屬性、設定平均位元速率和緩衝區大小,以及 DWORD 陣列中的初始緩衝區完整性。 For more information, see "Setting Leaky Bucket Values for ASF Streams" section in this topic.

媒體基礎中的 ASF 支援

Windows Media 轉碼器