實作速率控制
本主題描述自定義管線物件如何支援可變播放速率,包括反向播放。 如需從應用程式使用速率控制的相關信息,請參閱 速率控制。
本主題包含下列幾節:
如果您要撰寫Microsoft Media Foundation 管線物件(媒體來源、轉換或媒體接收),您可能需要支援可變播放速率。 若要這樣做,請實作下列介面:
- 實作 IMFGetService 介面。
- 支援MF_RATE_CONTROL_SERVICE服務。 (請參閱 服務介面。)
- 實作 IMFRateSupport 介面,這個介面會取得 物件所支援的播放速率。
- 實作 IMFRateControl 介面,以取得或設定播放速率。
媒體來源
如果媒體來源支援利率控制,它應該同時執行IMFRateSupport和IMFRateControl。 否則,媒體會話會報告無論管線中有哪些其他元件,播放速率下限和最大值都是 1.0。
播放速率不會影響樣本的呈現時間,因此媒體來源不應調整其時間戳。 相反地,簡報時鐘會以更快的速度或速度執行。 針對反向播放,來源會以反向順序傳遞樣本,並降低時間戳。
IMFRateControl::SetRate 方法的 fThin 參數會指出媒體來源是否應該精簡內容。 精簡主要適用於視訊串流。 在精簡模式中,來源會卸除差異畫面格,並只提供主要畫面格。 在非常高的播放速率下,來源可能會略過一些主要畫面格(例如,傳遞所有其他主要畫面格)。
來源不需要以精簡模式卸除音訊樣本。 不過,在非常高的播放速率下,來源可能無法快速讀取數據,以填滿管線的範例要求。 在此情況下,來源可能需要卸除某些音訊數據。 如果是的話,它應該嘗試傳遞接近視訊樣本的音訊樣本(假設來源有這兩種類型的數據流)。
當數據流在精簡和非精簡模式之間轉換時,它會傳送 MEStreamThinMode 事件。
當媒體來源完成對 SetRate 的呼叫時,它會傳送 MESourceRateChanged 事件。
在反向播放期間:
- 媒體來源會以反向順序傳遞樣本,而不需要調整時間戳。
- 數據流內的時間戳應該會單調減少。
- 內容的開頭會被視為數據流的結尾。 在每個媒體串流傳遞數據流中的第一個範例之後(也就是簡報時間 = 0),它會傳送 MEEndOfStream 事件。
媒體基礎轉換
一般而言,除非 MFT 實作非精簡的反向播放,否則媒體基礎轉換 (MFT) 不需要明確支援速率控制。
如果 MFT 未實 作 IMFRateSupport 介面,媒體會話會假設下列各項:
- MFT 支援轉送播放的仲裁播放速率,無論是精簡還是非精簡。
- MFT 支援精簡的反向播放,但不支援非精簡的反向播放。
如果上述任一條件不成立,MFT 應實作 IMFRateSupport 和 IMFRateControl。
反向播放
即使管線中的一或多個轉換未明確支援反向播放,媒體會話仍可反向播放。
如果 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 方法。
相關主題