共用方式為


實施速率控制

本主題描述自定義管線物件如何支援可變播放速率,包括反向播放。 如需從應用程式使用速率控制的相關信息,請參閱 速率控制

本主題包含下列幾節:

如果您要撰寫Microsoft Media Foundation 管線物件(媒體來源、轉換或媒體接收),您可能需要支援可變播放速率。 若要這樣做,請實作下列介面:

  1. 實作 IMFGetService 介面。
  2. 支援MF_RATE_CONTROL_SERVICE服務。 (請參閱 服務介面。)
  3. 實作 IMFRateSupport 介面,這個介面會取得 物件所支援的播放速率。
  4. 實作 IMFRateControl 介面,以取得或設定播放速率。

媒體來源

如果媒體來源支援速率控制,它應該同時執行IMFRateSupportIMFRateControl。 否則,媒體會話會報告無論管線中有哪些其他元件,播放速率下限和最大值都是 1.0。

播放速率不會影響樣本的呈現時間,因此媒體來源不應調整其時間戳。 相反地,簡報時鐘會以更快或更慢的速度運行。 針對反向播放,來源會以反向順序傳遞數據,且時間戳遞減。

IMFRateControl::SetRate 方法的 fThin 參數會指出媒體來源是否應該精簡內容。 精簡主要適用於視訊串流。 在精簡模式下,來源會刪除差異畫格,只保留關鍵畫格。 在非常高的播放速率下,來源可能會略過一些主要畫面格(例如,傳遞所有其他主要畫面格)。

來源在精簡化模式中不必捨去音訊樣本。 不過,在非常高的播放速率下,來源可能無法快速讀取數據以滿足管線的資料請求。 在此情況下,來源可能需要刪除某些音訊資料。 如果是的話,它應該嘗試傳遞接近視訊樣本的音訊樣本(假設來源有這兩種類型的數據流)。

當數據流在精簡和非精簡模式之間轉換時,它會傳送 MEStreamThinMode 事件。

當媒體來源完成對 SetRate 的呼叫時,它會傳送 MESourceRateChanged 事件。

在反向播放期間:

  • 媒體來源會以反向順序傳遞樣本,而不需要調整時間戳。
  • 數據流內的時間戳應該會單調減少。
  • 內容的開頭會被視為數據流的結尾。 在每個媒體串流傳遞數據流中的第一個範例之後(也就是展示時間 = 0),它會傳送 MEEndOfStream 事件。

媒體基礎架構轉換處理

一般而言,媒體基礎轉換(MFT)不需要明確支援速率控制,除非 MFT 實作的是未經過精簡的反向播放。

如果 MFT 未實作 IMFRateSupport 介面,媒體工作階段會假設以下事項:

  • MFT 支援向前播放的任意播放速率,無論是精簡與非精簡。
  • MFT 支援精簡的反向播放,但不支援非精簡的反向播放。

如果上述任一條件不成立,MFT 應實作 IMFRateSupportIMFRateControl

反向播放

即使管線中的一或多個轉換未明確支援反向播放,媒體會話仍然可以反向播放。

如果 MFT 未公開 IMFRateSupport 介面,媒體會話會使用精簡進行反向播放,如下所示:

  • 媒體會話通過呼叫IMFTransform::ProcessInput,以通常的方式將關鍵幀傳送至 MFT。

  • 媒體會話會丟棄差異畫面,並以MEStreamTick事件取代它們。

  • 在每個範例之間,Media Session 會清空 MFT,以避免因時間戳遞減所造成的任何錯誤。

如果範例的 MFSampleExtension_CleanPoint 屬性設定為 TRUE,則該範例被視為關鍵畫面;如果此屬性設定為 FALSE 或未設定,則被視為變動畫面。

如果 MFT 實作 IMFRateSupport,媒體會話會使用此介面來探索 MFT 是否支援非精簡的反向播放。 如果 MFT 支援非精簡的反向播放,媒體會話會以反向順序傳遞所有樣本,而不會卸除樣本或排清 MFT。

如果 MFT 支援非精簡的反向播放,它應該實現 IMFRateControl 介面。 媒體會話將使用此介面在發生反向播放時通知 MFT。 此時,MFT必須做好準備,因為時間戳將減少,差值幀會以反向順序到達。 解碼器通常需要緩衝資料,直到接收到整個圖片群組(GOP),然後解碼整個 GOP,並以正確的(反向)順序輸出解碼後的畫面。

媒體匯集

如果媒體接收器是無固定速率的,媒體會話會假設該接收器可以處理任何播放速率。 媒體接收器不需要實施IMFRateSupport。 (無速率媒體接收器會從 IMFMediaSink::GetCharacteristics 方法傳回 MEDIASINK_RATELESS 旗標。)

否則,如果媒體接收端能處理 1.0 以外的播放速率,它應該實作 IMFRateSupport

媒體接收器不應該實作IMFRateControl。 播放速率變更時,簡報時鐘會呼叫媒體接收端的 IMFClockStateSink::OnClockSetRate 方法。

速率控制

搜尋、快速向前和反向播放