如何确定支持的速率
在更改播放速率之前,应用程序应检查管道中的对象是否支持播放速率。 IMFRateSupport 接口提供了获取最大前向和反向利率的方法、最接近所请求利率的受支持利率以及最慢的速率。 每个速率查询都可以指定播放方向以及是否使用精简。 使用 IMFRateControl 接口查询确切的播放速率。
有关更改播放速率的信息,请参阅 如何在媒体会话上设置播放速率。
有关播放速率的常规信息,请参阅 “关于速率控制”。
确定当前播放速率
从媒体会话获取速率控制服务。
IMFRateControl *pRateControl = NULL; hr = MFGetService( pMediaSession, MF_RATE_CONTROL_SERVICE, IID_IMFRateControl, (void**) &pRateControl );
在 MFGetService 的 punkObject 参数中传递初始化的 IMFMediaSession 接口指针。
应用程序必须通过媒体会话查询速率控制服务。 在内部,媒体会话查询拓扑中的对象。
调用 IMFRateControl::GetRate 方法以获取当前播放速率。
hr = pRateControl->GetRate(&bThin, &rate);
GetRate 的 pfThin 参数接收一个 BOOL 值,该值指示流当前是否正在精简。 如果应用程序不想查询对流的精简支持,则应用程序必须传递 NULL 。 pflRate 参数接收当前播放速率。
确定最接近的受支持率
从媒体会话获取速率支持服务。
IMFRateSupport *pRateSupport = NULL; hr = MFGetService( pMediaSession, MF_RATE_CONTROL_SERVICE, IID_IMFRateSupport, (void**) &pRateSupport );
在 MFGetService 的 punkObject 参数中传递初始化的 IMFMediaSession 接口指针。
调用 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 中收到最近的支持速率。 如果不支持该速率,并且没有可用的最接近的播放速率,则调用将返回适当的错误代码。
这些值可能会根据加载的管道组件而更改。 因此,每当加载新拓扑时,都应再次查询这些值。
如果不支持所需的播放速率,一个选项是单独查询拓扑中的每个对象,以确定特定组件是否不支持速率。 你可能能够在没有此组件的情况下重新生成拓扑,然后按所需的速率播放。 例如,如果音频呈现器以外的每个组件都支持给定速率,则可以在没有音频分支的情况下重新生成拓扑,并在没有音频的情况下以所需的速率播放。
确定支持速度最慢的速率
从媒体会话获取速率支持服务。
IMFRateSupport *pRateSupport = NULL; hr = MFGetService( pMediaSession, MF_RATE_CONTROL_SERVICE, IID_IMFRateSupport, (void**) &pRateSupport );
在 MFGetService 的 punkObject 参数中传递初始化的 IMFMediaSession 接口指针。
调用 IMFRateSupport::GetSlowestRate 方法以检索支持速度最慢的速率。
float slowestRate = 0; hr = pRateSupport->GetSlowestRate( MFRATE_REVERSE, TRUE, &slowestRate);
示例使用精简查询最慢的反向播放速率。 在 GetSlowestRate 的 slowestRate 参数中接收下限速率。
如果不支持反向播放或精简,则调用将返回适当的错误代码。
相关主题