共用方式為


實作速率控制

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

本主題包含下列幾節:

如果您要撰寫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::P rocessInput,以一般方式將主要畫面格傳送至 MFT。

  • 媒體會話會卸除差異畫面,並以MEStreamTick事件取代它們

  • 在每個範例之間,媒體會話會排清 MFT,以避免因為時間戳遞減所造成的任何錯誤。

如果範例的 MFSampleExtension_CleanPoint 屬性設定為 TRUE,則會將範例視為主要畫面格,如果此屬性為 FALSE 或未設定,則會視為差異框架。

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

如果 MFT 支援非精簡的反向播放,它應該實 作 IMFRateControl 介面。 媒體會話會使用此介面在發生反向播放時通知 MFT。 此時,必須備妥 MFT,時間戳才能減少,並讓差異畫面以反向順序到達。 譯碼器通常需要緩衝樣本,直到它收到整個圖片群組(GOP),然後譯碼整個 GOP,並以正確的(反向)順序輸出譯碼的畫面格。

媒體接收

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

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

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

速率控制

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