Udostępnij za pośrednictwem


Jak przeprowadzić szorowanie

Czyszczenie jest wykonywane w celu natychmiastowego wyszukiwania określonych punktów w pliku przez interakcję z wizualną reprezentacją czasu, taką jak pasek przewijania. W programie Media Foundation czyszczenie oznacza wyszukiwanie w pliku i uzyskanie jednej zaktualizowanej ramki.

Aby uzyskać informacje na temat czyszczenia, zobacz Informacje o kontroli przepływu.

Aby wykonać oczyszczanie

  1. Wywołaj MFGetService, aby uzyskać interfejs IMFRateControl z Sesji Multimedia.

    Uwaga

    Nie pobieraj interfejsu IMFRateControl ze źródła multimediów. Zawsze pobieraj interfejs z sesji multimedialnej.

     

  2. Wywołaj IMFRateControl::SetRate, aby ustawić szybkość odtwarzania na zero. Aby uzyskać więcej informacji na temat wywoływania tej metody, zobacz Jak ustawić częstotliwość odtwarzania w sesji multimediów.

  3. Utwórz pozycję wyszukiwania w PROPVARIANT, określając czas prezentacji, do którego chcesz wyszukać, w typie MFTIME .

  4. Wywołaj IMFMediaSession::Rozpocznij z pozycją wyszukiwania, aby rozpocząć odtwarzanie.

  5. Po zakończeniu operacji czyszczenia sesja multimediów wysyła zdarzenie MESessionScrubSampleComplete. Poczekaj na to zdarzenie przed ponownym wywołaniem , aby przeprowadzić kolejną operację czyszczenia.

Przykład

W poniższym przykładzie kodu pokazano, jak wykonać czyszczenie.

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;
}

Pomyślna operacja czyszczenia generuje zdarzenie MESessionScrubSampleComplete po zaktualizowaniu wszystkich ujść strumienia przy użyciu nowej ramki, a operacja czyszczenia zakończy się pomyślnie. Przeczyszczanie pliku wideo powoduje wyświetlenie ramki, do której nastąpiła próba, ale nie generuje danych wyjściowych dźwięku.

Aplikacja może wykonywać kroki ramki, ustawiając szybkość odtwarzania na zero, a następnie przekazując PROPVARIANT ustawioną na VT_EMPTY podczas wywołania funkcji IMFMediaSession::Start.

sesja multimediów

Kontrola szybkości