Como determinar as taxas com suporte

Antes de alterar a taxa de reprodução, um aplicativo deve marcar se a taxa de reprodução tem suporte dos objetos no pipeline. A interface IMFRateSupport fornece métodos para obter as taxas máximas de avanço e reversão, a taxa com suporte mais próxima de uma taxa solicitada e a taxa mais lenta. Cada uma dessas consultas de taxa pode especificar a direção de reprodução e se deseja usar o afinamento. A taxa de reprodução exata é consultada usando a interface IMFRateControl .

Para obter informações sobre como alterar as taxas de reprodução, consulte Como definir a taxa de reprodução na sessão de mídia.

Para obter informações gerais sobre taxas de reprodução, consulte Sobre o controle de taxa.

Para determinar a taxa de reprodução atual

  1. Obtenha o serviço de controle de taxa da Sessão de Mídia.

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

    Passe um ponteiro de interface IMFMediaSession inicializado no parâmetro punkObject de MFGetService.

    O aplicativo deve consultar o serviço de controle de taxa por meio da Sessão de Mídia. Internamente, a Sessão de Mídia consulta os objetos na topologia.

  2. Chame o método IMFRateControl::GetRate para obter a taxa de reprodução atual.

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

    O parâmetro pfThin de GetRate recebe um valor BOOL que indica se o fluxo está sendo afinado no momento. O aplicativo deverá passar NULL se não quiser consultar o suporte de afinamento para o fluxo. O parâmetro pflRate recebe a taxa de reprodução atual.

Para determinar a taxa com suporte mais próxima

  1. Obtenha o serviço de suporte de taxa da Sessão de Mídia.

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

    Passe um ponteiro de interface IMFMediaSession inicializado no parâmetro punkObject de MFGetService.

  2. Chame o método IMFRateSupport::IsRateSupported para recuperar a taxa com suporte mais próxima de uma taxa de reprodução solicitada.

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

    O exemplo consulta se há suporte para uma taxa de reprodução de 4,0 com afinamento. Isso é indicado passando TRUE no parâmetro fThin de IsRateSupported. Se essa taxa tiver suporte, actualRate conterá a taxa de reprodução de 4,0 e a chamada terá êxito com um valor retornado de S_OK. Se não houver suporte para a taxa de reprodução exata, a taxa com suporte mais próxima será recebida em actualRate. Se não houver suporte para a taxa e não houver nenhuma taxa de reprodução mais próxima disponível, a chamada retornará um código de erro apropriado.

    Esses valores podem ser alterados dependendo de quais componentes de pipeline são carregados. Portanto, você deve consultar os valores novamente sempre que carregar uma nova topololgy.

    Se não houver suporte para a taxa de reprodução desejada, uma opção é consultar cada objeto na topologia individualmente para descobrir se um componente específico não dá suporte à taxa. Você pode recompilar a topologia sem esse componente e, em seguida, reproduzir na taxa desejada. Por exemplo, se cada componente, exceto o renderizador de áudio, oferecer suporte a uma determinada taxa, você poderá recompilar a topologia sem o branch de áudio e reproduzir na taxa desejada sem áudio.

Para determinar a taxa com suporte mais lenta

  1. Obtenha o serviço de suporte de taxa da Sessão de Mídia.

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

    Passe um ponteiro de interface IMFMediaSession inicializado no parâmetro punkObject de MFGetService.

  2. Chame o método IMFRateSupport::GetSlowestRate para recuperar a taxa com suporte mais lenta.

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

    O exemplo consulta a taxa de reprodução inversa mais lenta com o afinamento. A taxa de limite mais baixa é recebida no parâmetro slowestRate de GetSlowestRate.

    Se não houver suporte para a reprodução reversa ou o afinamento, a chamada retornará um código de erro apropriado.

Sessão de Mídia

Controle de taxa

Busca, avanço rápido e jogo reverso