如何确定支持的速率

在更改播放速率之前,应用程序应检查管道中的对象是否支持播放速率。 IMFRateSupport 接口提供了获取最大前向和反向利率的方法、最接近所请求利率的受支持利率以及最慢的速率。 每个速率查询都可以指定播放方向以及是否使用精简。 使用 IMFRateControl 接口查询确切的播放速率。

有关更改播放速率的信息,请参阅 如何在媒体会话上设置播放速率。

有关播放速率的常规信息,请参阅 “关于速率控制”。

确定当前播放速率

  1. 从媒体会话获取速率控制服务。

    IMFRateControl *pRateControl = NULL;
    hr = MFGetService(
           pMediaSession, 
           MF_RATE_CONTROL_SERVICE,
           IID_IMFRateControl, 
           (void**) &pRateControl );
    

    在 MFGetService 的 punkObject 参数中传递初始化IMFMediaSession 接口指针。

    应用程序必须通过媒体会话查询速率控制服务。 在内部,媒体会话查询拓扑中的对象。

  2. 调用 IMFRateControl::GetRate 方法以获取当前播放速率。

    hr = pRateControl->GetRate(&bThin, &rate);
    

    GetRate pfThin 参数接收一个 BOOL 值,该值指示流当前是否正在精简。 如果应用程序不想查询对流的精简支持,则应用程序必须传递 NULLpflRate 参数接收当前播放速率。

确定最接近的受支持率

  1. 从媒体会话获取速率支持服务。

    IMFRateSupport *pRateSupport = NULL;
    hr = MFGetService(
           pMediaSession, 
           MF_RATE_CONTROL_SERVICE,
           IID_IMFRateSupport, 
           (void**) &pRateSupport );
    

    在 MFGetService 的 punkObject 参数中传递初始化IMFMediaSession 接口指针。

  2. 调用 IMFRateSupport::IsRateSupported 方法,以检索最接近所请求播放速率的受支持速率。

    float rateRequested = 4.0;
    float actualRate = 0;
    hr = pRateSupport->IsRateSupported(
           TRUE, 
           rateRequested, 
           &actualRate );
    

    该示例查询是否支持精简的 4.0 播放速率。 这是通过在 IsRateSupported fThin 参数中传递 TRUE 来指示的。 如果支持此速率, 则 actualRate 包含 4.0 的播放速率,并且调用成功,返回值为 S_OK。 如果不支持确切的播放速率,则会在 actualRate收到最近的支持速率。 如果不支持该速率,并且没有可用的最接近的播放速率,则调用将返回适当的错误代码。

    这些值可能会根据加载的管道组件而更改。 因此,每当加载新拓扑时,都应再次查询这些值。

    如果不支持所需的播放速率,一个选项是单独查询拓扑中的每个对象,以确定特定组件是否不支持速率。 你可能能够在没有此组件的情况下重新生成拓扑,然后按所需的速率播放。 例如,如果音频呈现器以外的每个组件都支持给定速率,则可以在没有音频分支的情况下重新生成拓扑,并在没有音频的情况下以所需的速率播放。

确定支持速度最慢的速率

  1. 从媒体会话获取速率支持服务。

    IMFRateSupport *pRateSupport = NULL;
    hr = MFGetService(
           pMediaSession, 
           MF_RATE_CONTROL_SERVICE,
           IID_IMFRateSupport, 
           (void**) &pRateSupport );
    

    在 MFGetService 的 punkObject 参数中传递初始化IMFMediaSession 接口指针。

  2. 调用 IMFRateSupport::GetSlowestRate 方法以检索支持速度最慢的速率。

    float slowestRate = 0;
    hr = pRateSupport->GetSlowestRate(
           MFRATE_REVERSE, 
           TRUE, 
           &slowestRate);
    

    示例使用精简查询最慢的反向播放速率。 在 GetSlowestRate 的 slowestRate 参数中接收下限速率。

    如果不支持反向播放或精简,则调用将返回适当的错误代码。

媒体会话

速率控制

查找、快速转发和反向播放