Como determinar as taxas com suporte
Antes de alterar a taxa de reprodução, um aplicativo deve verificar se a taxa de reprodução é suportada pelos objetos no pipeline. A interface IMFRateSupport fornece métodos para obter as taxas máximas de encaminhamento e reversão, a taxa suportada 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
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 do 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.
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
Obtenha o serviço de suporte de tarifas 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 do MFGetService.
Chame o método IMFRateSupport::IsRateSupported para recuperar a taxa suportada 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 uma taxa de reprodução de 4,0 é suportada com o afinamento. Isso é indicado passando TRUE no parâmetro fThin de IsRateSupported. Se essa taxa for suportada, actualRate conterá a taxa de reprodução de 4,0 e a chamada será bem-sucedida com um valor de retorno 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 determinado componente não oferece suporte à taxa. Talvez seja possível reconstruir a topologia sem esse componente e, em seguida, jogar na taxa desejada. Por exemplo, se todos os componentes, exceto o renderizador de áudio, suportarem uma determinada taxa, você poderá reconstruir a topologia sem a ramificação de áudio e reproduzir na taxa desejada sem áudio.
Para determinar a taxa suportada mais lenta
Obtenha o serviço de suporte de tarifas 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 do MFGetService.
Chame o método IMFRateSupport::GetSlowestRate para recuperar a taxa mais lenta com suporte.
float slowestRate = 0; hr = pRateSupport->GetSlowestRate( MFRATE_REVERSE, TRUE, &slowestRate);
O exemplo consulta a taxa de reprodução reversa mais lenta com o afinamento. A taxa limite inferior é recebida no parâmetro slowestRate de GetSlowestRate.
Se a reprodução reversa ou o afinamento não for suportado, a chamada retornará um código de erro apropriado.
Tópicos relacionados