如何在媒体会话上设置播放速率

若要实现快进和快退等播放功能,应用程序可能需要更改媒体流的播放速率。 Media Foundation 提供速率控制服务,应用程序必须使用该服务来动态设置播放速率。

在设置播放速率之前,应用程序应检查媒体源是否支持该速率。 有关查询支持的费率的信息,请参阅 如何确定支持的费率

有关播放速率的信息,请参阅 关于速率控制

设置播放速率

  1. 调用 MFGetService 从媒体会话获取速率控制对象。

    调用 MFGetService 的应用程序必须确保以下各项:

    • punkObject 参数包含初始化的 IMFMediaSession 接口指针。
    • 释放 ppvObject 参数中接收的速率控制对象,以避免内存泄漏。
  2. 调用 IMFRateControl::SetRate 方法来设置播放速率。 SetRate 异步完成后,应用程序会收到 MESessionRateChanged 事件。

示例

以下代码演示如何通过调用 SetRate 方法设置播放速率。

///////////////////////////////////////////////////////////////////////
//  Name: SetPlaybackRate
//  Description: 
//      Gets the rate control service from Media Session.
//      Sets the playback rate to the specified rate.
//  Parameter:
//      pMediaSession: [in] Media session object to query.
//      rateRequested: [in] Playback rate to set.
//      bThin: [in] Indicates whether to use thinning.
///////////////////////////////////////////////////////////////////////

HRESULT SetPlaybackRate(
          IMFMediaSession *pMediaSession, 
          float rateRequested, 
          BOOL bThin)
{
    HRESULT hr = S_OK;
    IMFRateControl *pRateControl = NULL;

    // Get the rate control object from the Media Session.
    hr = MFGetService( 
           pMediaSession, 
           MF_RATE_CONTROL_SERVICE, 
           IID_IMFRateControl, 
           (void**) &pRateControl ); 

    // Set the playback rate.
    if(SUCCEEDED(hr))
    {
        hr = pRateControl ->SetRate( bThin, rateRequested); 
    }

    // Clean up.
    SAFE_RELEASE(pRateControl );

    return hr;
}

必须先停止或暂停应用程序,然后才能从负速率或零速率转换到正速率。 有关这些状态的信息,请参阅 如何控制演示状态

媒体会话

速率控制

查找、快进和反向播放