實作速率控制

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

本主題包含下列幾節:

如果您要 (媒體來源、轉換或媒體接收) 撰寫 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。 (無速率媒體接收會從 IMFMediaSink::GetCharacteristics 方法傳回MEDIASINK_RATELESS旗標。)

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

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

速率控制

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