Partilhar via


Implementar o controle de taxa

Este tópico descreve como objetos de pipeline personalizados podem dar suporte a taxas de reprodução variáveis, incluindo reprodução reversa. Para obter informações sobre como usar o controle de taxa de um aplicativo, consulte Controle de taxa.

Este tópico contém as seguintes seções:

Se você estiver escrevendo um objeto de pipeline do Microsoft Media Foundation (uma fonte de mídia, transformação ou coletor de mídia), talvez seja necessário oferecer suporte a taxas de reprodução variáveis. Para fazer isso, implemente as seguintes interfaces:

  1. Implemente a interface IMFGetService.
  2. Apoie o serviço MF_RATE_CONTROL_SERVICE . (Veja Interfaces de serviço.)
  3. Implemente a interface IMFRateSupport , que obtém as taxas de reprodução compatíveis com o objeto.
  4. Implemente a interface IMFRateControl , que obtém ou define a taxa de reprodução.

Fontes de mídia

Se uma fonte de mídia der suporte ao controle de taxa, ela deverá implementar IMFRateSupport e IMFRateControl. Caso contrário, a Sessão de Mídia relata que a taxa de reprodução mínima e máxima é 1,0, independentemente de quais outros componentes estão no pipeline.

A taxa de reprodução não afeta os tempos de apresentação das amostras, portanto, a fonte de mídia não deve ajustar seus carimbos de data/hora. Em vez disso, o relógio de apresentação é executado em uma velocidade mais rápida ou mais lenta. Para reprodução reversa, a fonte fornece amostras em ordem inversa, com carimbos de data/hora decrescentes.

O parâmetro fThin do método IMFRateControl::SetRate indica se a fonte de mídia deve reduzir o conteúdo. O afinamento se aplica principalmente a streams de vídeo. No modo reduzido, a origem descarta quadros delta e fornece apenas quadros-chave. Em taxas de reprodução muito altas, a origem pode ignorar alguns quadros-chave (por exemplo, entregar todos os outros quadros-chave).

A fonte não precisa descartar amostras de áudio no modo reduzido. No entanto, em taxas de reprodução muito altas, a origem pode não ser capaz de ler dados com rapidez suficiente para atender às solicitações de exemplo do pipeline. Nesse caso, a fonte pode precisar descartar alguns dados de áudio. Nesse caso, ele deve tentar fornecer amostras de áudio próximas no tempo das amostras de vídeo (supondo que a origem tenha os dois tipos de fluxo).

Quando um fluxo faz a transição entre o modo diluído e não afinado, ele envia um evento MEStreamThinMode .

Quando a fonte de mídia conclui uma chamada para SetRate, ela envia o evento MESourceRateChanged .

Durante a reprodução reversa:

  • A fonte de mídia fornece amostras na ordem inversa, sem ajustar os carimbos de data/hora.
  • Os carimbos de data/hora em um fluxo devem diminuir monotonicamente.
  • O início do conteúdo é considerado o fim do fluxo. Depois que cada fluxo de mídia fornece o primeiro exemplo no fluxo (ou seja, tempo de apresentação = 0), ele envia o evento MEEndOfStream .

Transformações do Media Foundation

Em geral, uma MFT (transformação do Media Foundation) não precisa de suporte explícito para controle de taxa, a menos que a MFT implemente a reprodução reversa não reduzida.

Se um MFT não implementar a interface IMFRateSupport , a Sessão de Mídia pressupõe o seguinte:

  • O MFT dá suporte a taxas de reprodução arbitrárias para reprodução direta, tanto reduzidas quanto não reduzidas.
  • O MFT dá suporte à reprodução reversa reduzida, mas não dá suporte à reprodução reversa não reduzida.

Se qualquer uma dessas condições não for verdadeira, o MFT deverá implementar IMFRateSupport e IMFRateControl.

Reprodução reversa

A Sessão de Mídia pode ser reproduzida ao contrário, mesmo que uma ou mais transformações no pipeline não ofereçam suporte explícito à reprodução inversa.

Se um MFT não expor a interface IMFRateSupport , a Sessão de Mídia usará o afinamento para reprodução reversa, da seguinte maneira:

  • A Sessão de Mídia envia quadros-chave para o MFT da maneira usual, chamando IMFTransform::P rocessInput.

  • A Sessão de Mídia descarta quadros delta e os substitui por eventos MEStreamTick .

  • Entre cada exemplo, a Sessão de Mídia libera o MFT, para evitar erros causados pelo fato de que os carimbos de data/hora estão diminuindo.

Uma amostra é considerada um quadro-chave se tiver o atributo MFSampleExtension_CleanPoint definido como TRUE e é considerada um quadro delta se esse atributo for FALSE ou não estiver definido.

Se o MFT implementar IMFRateSupport, a Sessão de Mídia usará essa interface para descobrir se o MFT dá suporte à reprodução reversa não reduzida. Se o MFT der suporte à reprodução reversa não reduzida, a Sessão de Mídia fornecerá todos os exemplos, na ordem inversa, sem descartar exemplos ou liberar o MFT.

Se um MFT der suporte à reprodução reversa não reduzida, ele deverá implementar a interface IMFRateControl . A Sessão de Mídia usará essa interface para notificar o MFT quando ocorrer a reprodução reversa. Nesse ponto, o MFT deve ser preparado para que os carimbos de data/hora diminuam e para que os quadros delta cheguem na ordem inversa. Um decodificador normalmente precisará armazenar amostras em buffer até receber um grupo inteiro de imagens (GOP) e, em seguida, decodificar todo o GOP e gerar os quadros decodificados na ordem correta (inversa).

Coletores de mídia

Se um coletor de mídia não tiver taxa, a Sessão de Mídia pressupõe que o coletor de mídia pode lidar com qualquer taxa de reprodução. O coletor de mídia não precisa implementar IMFRateSupport. (Um coletor de mídia sem taxa retorna o sinalizador MEDIASINK_RATELESS do Método IMFMediaSink::GetCharacteristics .)

Caso contrário, um coletor de mídia deverá implementar IMFRateSupport se puder lidar com taxas de reprodução diferentes de 1.0.

Os coletores de mídia não devem implementar IMFRateControl. Quando a taxa de reprodução é alterada, o relógio de apresentação chama o método IMFClockStateSink::OnClockSetRate do coletor de mídia.

Controle de taxa

Buscando, avançando e invertendo o jogo