Cómo realizar la limpieza

La limpieza se realiza para buscar instantáneamente puntos específicos dentro de un archivo mediante la interacción con una representación visual del tiempo, como una barra de desplazamiento. En Media Foundation, la limpieza significa buscar en un archivo y obtener un fotograma actualizado.

Para obtener información sobre el limpieza, vea Acerca del control de velocidad.

Para realizar el limpieza

  1. Llame a MFGetService para obtener la interfaz IMFRateControl desde la sesión multimedia.

    Nota

    No obtenga la interfaz IMFRateControl de la fuente multimedia. Obtenga siempre la interfaz de la sesión multimedia.

     

  2. Llame a IMFRateControl::SetRate para establecer la velocidad de reproducción en cero. Para obtener más información sobre cómo llamar a este método, vea Cómo establecer la velocidad de reproducción en la sesión multimedia.

  3. Cree una posición de búsqueda en un PROPVARIANT especificando la hora de presentación a la que buscar en un tipo MFTIME .

  4. Llame a IMFMediaSession::Start con la posición de búsqueda para iniciar la reproducción.

  5. Una vez completada la operación de limpieza, la sesión multimedia envía un evento MESessionScrubSampleComplete . Espere este evento antes de llamar a Start de nuevo para otra operación de limpieza.

Ejemplo

En el ejemplo de código siguiente se muestra cómo realizar el limpieza.

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

Una operación de limpieza correcta genera el evento MESessionScrubSampleComplete después de actualizar todos los receptores de secuencia con el nuevo marco y la operación de limpieza se completa correctamente. Al limpiar un archivo de vídeo se muestra el fotograma al que se ha buscado, pero no se genera una salida de audio.

La aplicación puede realizar la ejecución paso a paso de fotogramas estableciendo la velocidad de reproducción en cero y pasando un PROPVARIANT establecido en VT_EMPTY en la llamada a IMFMediaSession::Start.

Sesión multimedia

Control de frecuencia