Cómo determinar las tasas admitidas

Antes de cambiar la velocidad de reproducción, una aplicación debe comprobar si los objetos de la canalización admiten la velocidad de reproducción. La interfaz IMFRateSupport proporciona métodos para obtener los tipos de avance e inverso máximos, la tasa admitida más cercana a una tasa solicitada y la tasa más lenta. Cada una de estas consultas de velocidad puede especificar la dirección de reproducción y si se debe usar el fino. La velocidad de reproducción exacta se consulta mediante la interfaz IMFRateControl .

Para obtener información sobre cómo cambiar las velocidades de reproducción, vea Cómo establecer la velocidad de reproducción en la sesión multimedia.

Para obtener información general sobre las velocidades de reproducción, vea Acerca del control de velocidad.

Para determinar la velocidad de reproducción actual

  1. Obtenga el servicio de control de velocidad de la sesión multimedia.

    IMFRateControl *pRateControl = NULL;
    hr = MFGetService(
           pMediaSession, 
           MF_RATE_CONTROL_SERVICE,
           IID_IMFRateControl, 
           (void**) &pRateControl );
    

    Pase un puntero de interfaz IMFMediaSession inicializado en el parámetro punkObject de MFGetService.

    La aplicación debe consultar el servicio de control de velocidad a través de la sesión multimedia. Internamente, la sesión multimedia consulta los objetos de la topología.

  2. Llame al método IMFRateControl::GetRate para obtener la velocidad de reproducción actual.

    hr = pRateControl->GetRate(&bThin, &rate);
    

    El parámetro pfThin de GetRate recibe un valor BOOL que indica si la secuencia está siendo delgada actualmente. La aplicación debe pasar NULL si no desea consultar la compatibilidad con el fino para la secuencia. El parámetro pflRate recibe la velocidad de reproducción actual.

Para determinar la tasa admitida más cercana

  1. Obtenga el servicio de soporte técnico de tarifas de la sesión multimedia.

    IMFRateSupport *pRateSupport = NULL;
    hr = MFGetService(
           pMediaSession, 
           MF_RATE_CONTROL_SERVICE,
           IID_IMFRateSupport, 
           (void**) &pRateSupport );
    

    Pase un puntero de interfaz IMFMediaSession inicializado en el parámetro punkObject de MFGetService.

  2. Llame al método IMFRateSupport::IsRateSupported para recuperar la tasa admitida más cercana a una velocidad de reproducción solicitada.

    float rateRequested = 4.0;
    float actualRate = 0;
    hr = pRateSupport->IsRateSupported(
           TRUE, 
           rateRequested, 
           &actualRate );
    

    En el ejemplo se consulta si se admite una velocidad de reproducción de 4.0 con el fino. Esto se indica pasando TRUE en el parámetro fThin de IsRateSupported. Si se admite esta velocidad, actualRate contiene la velocidad de reproducción de 4,0 y la llamada se realiza correctamente con un valor devuelto de S_OK. Si no se admite la velocidad de reproducción exacta, la velocidad admitida más cercana se recibe en actualRate. Si no se admite la velocidad y no hay ninguna velocidad de reproducción más cercana disponible, la llamada devuelve un código de error adecuado.

    Estos valores pueden cambiar en función de qué componentes de canalización se cargan. Por lo tanto, debe consultar los valores de nuevo cada vez que cargue un nuevo topololgy.

    Si no se admite la velocidad de reproducción deseada, una opción es consultar cada objeto de la topología individualmente para averiguar si un componente determinado no admite la velocidad. Es posible que pueda volver a generar la topología sin este componente y, a continuación, reproducir a la velocidad deseada. Por ejemplo, si cada componente excepto el representador de audio admite una velocidad determinada, podría volver a generar la topología sin la rama de audio y reproducir a la velocidad deseada sin audio.

Para determinar la velocidad admitida más lenta

  1. Obtenga el servicio de soporte técnico de tarifas de la sesión multimedia.

    IMFRateSupport *pRateSupport = NULL;
    hr = MFGetService(
           pMediaSession, 
           MF_RATE_CONTROL_SERVICE,
           IID_IMFRateSupport, 
           (void**) &pRateSupport );
    

    Pase un puntero de interfaz IMFMediaSession inicializado en el parámetro punkObject de MFGetService.

  2. Llame al método IMFRateSupport::GetSlowestRate para recuperar la tasa admitida más lenta.

    float slowestRate = 0;
    hr = pRateSupport->GetSlowestRate(
           MFRATE_REVERSE, 
           TRUE, 
           &slowestRate);
    

    En el ejemplo se consulta la velocidad de reproducción inversa más lenta con el fino. La velocidad de límite inferior se recibe en el parámetro slowestRate de GetSlowestRate.

    Si no se admite la reproducción inversa o el fino, la llamada devuelve un código de error adecuado.

Sesión multimedia

Control de frecuencia

Búsqueda, avance rápido y juego inverso