如何执行清理
通过与时间的可视表示形式(如滚动条)交互,执行清理以即时查找文件中的特定点。 在媒体基础中,清理意味着查找文件并获取一个更新的帧。
有关清理的信息,请参阅 关于速率控制。
执行清理
调用 MFGetService 从媒体会话获取 IMFRateControl 接口。
注意
不要从媒体源获取 IMFRateControl 接口。 始终从媒体会话获取接口。
调用 IMFRateControl::SetRate 将播放速率设置为零。 有关调用此方法的详细信息,请参阅 如何在媒体会话上设置播放速率。
通过在 MFTIME 类型中指定要查找的呈现时间,在 PROPVARIANT 中创建查找位置。
调用 IMFMediaSession::以 查找位置开始播放。
清理操作完成后,媒体会话将发送 MESessionScrubSampleComplete 事件。 等待此事件,然后再次调用 Start 执行另一个清理操作。
示例
下面的代码示例演示如何执行清理。
HRESULT SkipToPosition (MFTIME SeekTime, IMFMediaSession *pMediaSession)
{
PROPVARIANT var;
PropVariantInit(&var);
IMFRateControl *pRateControl = NULL;
// Get the rate control service.
HRESULT hr = MFGetService(pMediaSession, MF_RATE_CONTROL_SERVICE, IID_PPV_ARGS(&pRateControl));
// Set the playback rate to zero without thinning.
if(SUCCEEDED(hr))
{
hr = pRateControl ->SetRate( FALSE, 0.0F);
}
// Create the Media Session start position.
if( SeekTime == PRESENTATION_CURRENT_POSITION )
{
var.vt = VT_EMPTY;
}
else
{
var.vt = VT_I8;
var.hVal.QuadPart = SeekTime;
}
// Start the Media Session.
if(SUCCEEDED(hr))
{
hr = pMediaSession->Start( NULL, &var);
}
// Clean up.
SafeRelease(&pRateControl);
PropVariantClear(&var)
return hr;
}
使用新帧更新所有流接收器并成功完成清理操作后,如果清理操作成功,将生成 MESessionScrubSampleComplete 事件。 清理视频文件会显示已查找的帧,但不生成音频输出。
应用程序可以通过将播放速率设置为零,然后在调用 IMFMediaSession::Start 时传递设置为VT_EMPTY的 PROPVARIANT 来执行帧步进。
相关主题