Come eseguire lo scrubbing

Lo scrubbing viene eseguito per cercare istantaneamente punti specifici all'interno di un file interagendo con una rappresentazione visiva del tempo, ad esempio una barra di scorrimento. In Media Foundation, lo scrubbing significa cercare un file e ottenere un frame aggiornato.

Per informazioni sullo scrubbing, vedere Informazioni sul controllo frequenza.

Per eseguire lo scrubbing

  1. Chiamare MFGetService per ottenere l'interfaccia FMRateControl dalla sessione multimediale.

    Nota

    Non ottenere l'interfaccia FMRateControl dall'origine multimediale. Ottenere sempre l'interfaccia dalla sessione multimediale.

     

  2. Chiamare FMIRateControl::SetRate per impostare la frequenza di riproduzione su zero. Per altre informazioni sulla chiamata a questo metodo, vedere Come impostare la frequenza di riproduzione nella sessione multimediale.

  3. Creare una posizione di ricerca in un OGGETTO PROPVARIANT specificando il tempo di presentazione da cercare in un tipo MFTIME .

  4. Chiamare FMIMediaSession::Start con la posizione di ricerca per avviare la riproduzione.

  5. Al termine dell'operazione di pulizia, la sessione multimediale invia un evento MESessionScrubSampleComplete . Attendere questo evento prima di chiamare di nuovo Start per un'altra operazione di pulizia.

Esempio

Nell'esempio di codice seguente viene illustrato come eseguire lo scrubbing.

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

Un'operazione di pulizia riuscita genera l'evento MESessionScrubSampleComplete dopo che tutti i sink di flusso vengono aggiornati con il nuovo frame e l'operazione di pulizia completa correttamente. Lo scrubbing di un file video visualizza il frame a cui è stato cercato, ma non genera un output audio.

L'applicazione può eseguire l'esecuzione dell'istruzione frame impostando la frequenza di riproduzione su zero e quindi passando un PROPVARIANT impostato su VT_EMPTY nella chiamata a FMIMediaSession::Start.

Sessione multimediale

Controllo frequenza