Compartilhar via


Como executar a limpeza

A limpeza é executada para procurar instantaneamente pontos específicos em um arquivo interagindo com uma representação visual de tempo, como uma barra de rolagem. No Media Foundation, esfregar significa procurar em um arquivo e obter um quadro atualizado.

Para obter informações sobre a limpeza, consulte Sobre o controle de taxa.

Para executar a limpeza

  1. Chame MFGetService para obter a interface IMFRateControl da Sessão de Mídia.

    Observação

    Não obtenha a interface IMFRateControl da fonte de mídia. Sempre obtenha a interface da Sessão de Mídia.

     

  2. Chame IMFRateControl::SetRate para definir a taxa de reprodução como zero. Para obter mais informações sobre como chamar esse método, consulte Como definir a taxa de reprodução na sessão de mídia.

  3. Crie uma posição de busca em um PROPVARIANT especificando o tempo de apresentação a ser buscado em um tipo MFTIME .

  4. Chame IMFMediaSession::Start com a posição de busca para iniciar a reprodução.

  5. Quando a operação de limpeza for concluída, a Sessão de Mídia enviará um evento MESessionScrubSampleComplete . Aguarde esse evento antes de chamar Iniciar novamente para outra operação de limpeza.

Exemplo

O exemplo de código a seguir mostra como executar a limpeza.

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

Uma operação de limpeza bem-sucedida gera o evento MESessionScrubSampleComplete depois que todos os coletores de fluxo são atualizados com o novo quadro e a operação de limpeza é concluída com êxito. A limpeza de um arquivo de vídeo exibe o quadro que foi buscado, mas não gera uma saída de áudio.

O aplicativo pode executar a etapa de quadro definindo a taxa de reprodução como zero e, em seguida, passando um PROPVARIANT definido como VT_EMPTY na chamada para IMFMediaSession::Start.

Sessão de Mídia

Controle de taxa