Compartilhar via


Como determinar as taxas com suporte

Antes de alterar a taxa de reprodução, um aplicativo deve verificar se a taxa de reprodução é compatível com os objetos no pipeline. A interface IMFRateSupport fornece métodos para obter as taxas máximas de encaminhamento 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 o afinamento deve ser usado. 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 na 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 reduzido no momento. O aplicativo deve passar NULL se não quiser consultar o suporte de desbaste para o fluxo. O parâmetro pflRate recebe a taxa de reprodução atual.

Para determinar a taxa suportada mais próxima

  1. Obtenha o serviço de suporte de taxa na 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 houver suporte para essa taxa, actualRate conterá a taxa de reprodução de 4.0 e a chamada será bem-sucedida com um valor retornado de S_OK. Se a taxa de reprodução exata não for suportada, a taxa suportada mais próxima será recebida em actualRate. Se a taxa não for suportada 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 mudar dependendo de quais componentes de pipeline são carregados. Portanto, você deve consultar os valores novamente sempre que carregar uma nova topologia.

    Se a taxa de reprodução desejada não for suportada, uma opção é consultar cada objeto na topologia individualmente, para descobrir se um componente específico não suporta a taxa. Você pode reconstruir a topologia sem esse componente e, em seguida, reproduzir na taxa desejada. Por exemplo, se todos os componentes, exceto o renderizador de áudio, derem suporte a uma determinada taxa, você poderá recompilar a topologia sem a ramificação de áudio e reproduzir na taxa desejada sem áudio.

Para determinar a taxa mais lenta com suporte

  1. Obtenha o serviço de suporte de taxa na 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 reversa mais lenta com afinamento. A taxa de limite inferior é recebida no parâmetro slowestRate de GetSlowestRate.

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

Sessão de Mídia

Controle de taxa

Buscando, avançando e invertendo o jogo