共用方式為


漏桶緩衝模型(Microsoft媒體基礎)

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

「leaky bucket」(漏桶)模型是一種用於模擬平滑播放緩衝需求的模型。 在此模型中,譯碼器會維護緩衝區。 編碼的數據會從網路進入緩衝區,並從緩衝區進入譯碼器。 如果緩衝區下溢,表示譯碼器正在從緩衝區中移除數據的速度比網路傳遞快。 如果緩衝區溢出,這表示網路傳送數據的速度比解碼器處理數據的速度更快。

本主題描述用於編碼和解碼的緩衝區的「漏桶」模型。

漏水的桶子

若要瞭解漏桶模型,請想像一個底部有小洞的桶子。 三個參數會定義桶:

  • 容量 (B)
  • 水流出貯體的速度(R)
  • 桶子的初始充滿度 (F)

在此隱喻中,水桶是緩衝區:

圖顯示緩衝區如同水桶,輸入速率如同進入水桶的水,而輸出速率如同水從水桶底部的洞流出

如果水以確切速率 R傾入水桶,則水桶會維持在 F,因為輸入速率等於輸出速率。 當輸入速率增加而 R 維持不變時,貯體會積水。 如果輸入速率在一段持續時間內大於 R,最終會導致桶子溢出。 不過,只要平均輸入速率不超過貯體的容量,輸入速率在 R 之間變化是可以的,且不會溢出貯體。 容量越大,輸入速率在指定的時間範圍內可能會有所不同。

在 ASF 中,漏桶是由三個參數所界定:

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

位速率會測量編碼數據流中的每秒平均位數。 緩衝區視窗會根據該位元速率測量能容納於緩衝區中的數據時間(毫秒)。 緩衝區的大小(以位為單位)等於 R * (B / 1000)。

ASF 承載數據可能會在不規則的時間和不規則的數量進入漏桶,但數據必須以固定的正比特率離開漏桶。 由於緩衝區窗口,資料進入儲存桶和離開的時間之間可能會有延遲。 可能發生的最大延遲是 B/R。 進入貯體中的負載數據會根據顯示時間排列,且不得溢出貯體。 除了呈現時間之外,每個有效負載也有其傳送時間,即數據根據比特率離開容器的時間。 傳送時間必須早於呈現時間,以確保當漏桶接近滿時,每個承載都會在呈現時間之前或時間到達時離開桶內。 為了達成此目的,簡報時間會由 B/R 值(預編)向前移動,而傳送時間會從零開始開始。 傳送時間必須不晚於簡報時間,因為這表示承載進入貯體太晚,而且不能包含在數據物件中。 前置值包含在 ASF 標頭物件 中。

為了實現無故障的網路串流,媒體內容內的壓縮串流必須在整個播放過程中維持固定的比特率。 ASF 漏桶模型可確保媒體資料會以固定的位元率透過網路傳送。 流失貯體的參數是在 ASF 標頭對象的擴充數據流屬性物件中指定。 在 Microsoft Media Foundation 中,它們被設置為代表數據流的媒體類型的屬性。

洩漏桶值被定義於 ASF 檔案接收端、基礎的 ASF 多工器物件以及 Windows Media 編碼器中。 這些值可能相同或不同。 例如,請考慮串流案例,這需要比影片範例晚提供音訊樣本,以便不需延遲地串流檔案。 若要達成此目的,可以將媒體接收器中的音訊流的漏桶機制設定為高於 Windows 媒體音訊編碼器中設定的值。

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

使用中的水桶

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

請考慮下列範例:您有一個 3 加侖的桶子,桶子上有個孔,通過該孔每分鐘能流出 1 加侖的水。 你把桶放在尖頂下,打開閥,以每分鐘1加侖的速度放出水。 水在進入桶時流出水面的速度很快,在貯體中沒有額外的水。 然後,您將水龍頭的流量增加到每分鐘 2 加侖。 每分鐘以這個流速流入桶中的水有2加侖,而有1加侖洩漏,最後剩下1加侖在桶中。 3分鐘結束時,6加侖的水已經進入水桶,3加侖已經洩漏出來,水桶滿了。

在實務上,絕對不會達到與緩衝區視窗相等間隔的理論最大數據速率。 上一個範例假設是固定的數據速率。 假設使用相同的 3 加侖桶子,您可以將水龍頭的流速提高到每分鐘 6 加侖,維持一分鐘後,再關閉水龍頭兩分鐘。 即使放入貯體中的水總量在緩衝視窗的理論最大值內,該量的濃度仍會進入視窗的一個部分,導致貯體溢位。 每分鐘 6 加侖時,3 加侖桶在 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 檔案接收器

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

  • 平均比特率:從媒體類型交涉期間選取的輸出媒體類型取得平均比特率。 使用 MF_MT_AUDIO_AVG_BYTES_PER_SECOND 屬性(適用於音訊數據流)或 MF_MT_AVG_BITRATE 屬性(適用於視訊串流)。
  • 緩衝區視窗:如果您有一個編碼器實例,並且已經協商好輸出媒體類型,您可以稍後通過查詢編碼器上的 IWMCodecLeakyBucket 介面,然後呼叫 IWMCodecLeakyBucket::GetBufferSizeBits(wmcodecifaces.h,wmcodecdspuuid.lib)來更新此值。 否則,請使用預設值 3000 毫秒。
  • 初始緩衝區大小:設定為 0。

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

針對 2 階段編碼模式,您必須設定這兩個屬性,以指定平均值和最大值。

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

如果要將 Windows Media 內容從來源直接複製到媒體接收器而不需編碼,則必須在媒體接收器中設置漏桶值。

ASF 多工器中的漏桶值

在 Media Foundation 中,ASF Multiplexer 使用漏桶值 來設定它用於生成數據包的內部漏桶值。 承載包含在媒體範例內,一系列媒體範例構成 ASF 數據封包。 根據漏桶值和呈現時間,多路复用器會為每個媒體樣本指派傳送時間,以確保通過網路傳送封包的比特率達到固定的位速率(R)。

應用程式無法直接在多工器中設定漏桶值。 必須在 ASF 媒體接收器上提供這些值,以在多工器上設定適當的值。 多工器會使用 MF_ASFSTREAMCONFIG_LEAKYBUCKET1MF_ASFSTREAMCONFIG_LEAKYBUCKET2 中設定的值來驗證傳送至 ASF 媒體接收器的樣本是使用指定的值所產生。

更新 ASF 媒體匯流中漏桶的值

應用程式可以在媒體接收器的屬性存放區中設定 MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET 屬性,以覆蓋在數據流建立期間於 ASF 配置檔中設定的流層級漏桶值。 若要取得屬性存放區的參考,請使用媒體接收所實作的 ContentInfo 物件。 如需詳細資訊,請參閱 在檔案匯出中設定屬性。

注意 只有音訊數據流才允許此作業。

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

類似於流失貯體數據流組態屬性,請設定平均比特率和緩衝區大小,以及 DWORD 陣列中的初始緩衝區完整度。 如需詳細資訊,請參閱本主題中的<設定 ASF 數據流的流失值區值>一節。

ASF 支援在媒體基礎中

Windows Media 編解碼器