Поделиться через


Как выполнить скрабирование

Очистка выполняется для мгновенного поиска определенных точек в файле, взаимодействуя с визуальным представлением времени, например полосой прокрутки. В Media Foundation очистка означает поиск по файлу и получение одного обновленного кадра.

Сведения о очистке см. в разделе оуправления скоростью.

Для выполнения очистки

  1. Вызовите MFGetService, чтобы получить интерфейс IMFRateControl из сеанса мультимедиа.

    Заметка

    Не получайте интерфейс IMFRateControl из источника мультимедиа. Всегда получайте интерфейс из Media Session.

     

  2. Вызовите IMFRateControl::SetRate, чтобы задать частоту воспроизведения нулю. Дополнительные сведения о вызове этого метода см. в разделе Как установить скорость воспроизведения на сеансе мультимедиа.

  3. Создайте позицию поиска в PROPVARIANT, указав время презентации для поиска в типе MFTIME.

  4. Вызов IMFMediaSession::Start с положением поиска для запуска воспроизведения.

  5. После завершения операции чистки сеанс мультимедиа отправляет событие MESessionScrubSampleComplete. Дождитесь этого события, прежде чем снова вызывать для другой операции очистки.

Пример

В следующем примере кода показано, как выполнять очистку.

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 после того, как все приемники потоков обновляются новым кадром, и операция очистки завершается успешно. При очистке видеофайла отображается кадр, на который был направлен запрос, но не создается звуковой выход.

Приложение может выполнить шаг кадра, установив скорость воспроизведения равной нулю, а затем передав PROPVARIANT, который установлен для VT_EMPTY, в вызове IMFMediaSession::Start.

Медиа-сеанс

контроль скорости