如何执行清理

通过与时间的可视表示形式(如滚动条)交互,执行清理以即时查找文件中的特定点。 在媒体基础中,清理意味着查找文件并获取一个更新的帧。

有关清理的信息,请参阅 关于速率控制

执行清理

  1. 调用 MFGetService媒体会话获取 IMFRateControl 接口。

    注意

    不要从媒体源获取 IMFRateControl 接口。 始终从媒体会话获取接口。

     

  2. 调用 IMFRateControl::SetRate 将播放速率设置为零。 有关调用此方法的详细信息,请参阅 如何在媒体会话上设置播放速率

  3. 通过在 MFTIME 类型中指定要查找的呈现时间,在 PROPVARIANT 中创建查找位置。

  4. 调用 IMFMediaSession::以 查找位置开始播放。

  5. 清理操作完成后,媒体会话将发送 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_EMPTYPROPVARIANT 来执行帧步进。

媒体会话

速率控制