如何确定支持的费率

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

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

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

确定当前播放速率

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

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

    MFGetServicepunkObject 参数中传递初始化的 IMFMediaSession 接口指针。

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

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

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

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

确定最接近的受支持费率

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

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

    MFGetServicepunkObject 参数中传递初始化的 IMFMediaSession 接口指针。

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

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

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

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

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

确定支持的最慢速率

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

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

    MFGetServicepunkObject 参数中传递初始化的 IMFMediaSession 接口指针。

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

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

    该示例通过精简查询最慢的反向播放速率。 在 GetSlowestRateslowestRate 参数中接收下限速率。

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

媒体会话

速率控制

查找、快进和反向播放