Compartilhar via


Implementar o controle de taxa

Este tópico descreve como objetos de pipeline personalizados podem oferecer 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 suportadas pelo 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 oferecer 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 da apresentação é executado a uma velocidade mais rápida ou mais lenta. Para reprodução reversa, a fonte entrega 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 afinar o conteúdo. O afinamento aplica-se principalmente a fluxos de vídeo. No modo reduzido, a fonte descarta quadros delta e entrega 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 soltar amostras de áudio no modo reduzido. Em taxas de reprodução muito altas, no entanto, a fonte pode não ser capaz de ler dados com rapidez suficiente para preencher as solicitações de amostra do pipeline. Nesse caso, a fonte pode precisar descartar alguns dados de áudio. Em caso afirmativo, ele deve tentar entregar amostras de áudio próximas às amostras de vídeo (supondo que a fonte tenha os dois tipos de fluxo).

Quando um fluxo faz a transição entre o modo desbastado e não desbastado, 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 entrega amostras em ordem inversa, sem ajustar os carimbos de data/hora.
  • Os carimbos de data/hora dentro de um fluxo devem diminuir monotonicamente.
  • O início do conteúdo é considerado o fim do fluxo. Depois que cada fluxo de mídia entrega a primeira amostra no fluxo (ou seja, tempo de apresentação = 0), ele envia o evento MEEndOfStream .

Transformações do Media Foundation

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

Se um MFT não implementar a interface IMFRateSupport , a sessão de mídia assume o seguinte:

  • O MFT suporta taxas de reprodução arbitrárias para reprodução direta, tanto diluídas quanto não afinadas.
  • O MFT suporta reprodução reversa reduzida, mas não suporta reprodução reversa não reduzida.

Se qualquer uma dessas condições não for verdadeira, o MFT deve 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 reversa.

Se um MFT não expor a interface IMFRateSupport , a sessão de mídia usa 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 amostra, 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.

Um exemplo é considerado um quadro-chave se tiver o atributo MFSampleExtension_CleanPoint definido como TRUE, e é considerado um quadro delta se esse atributo for FALSE ou não definido.

Se o MFT implementa IMFRateSupport, a sessão de mídia usa essa interface para descobrir se o MFT oferece suporte à reprodução reversa não diluída. Se o MFT oferecer suporte à reprodução reversa não diluída, a Sessão de Mídia entregará todas as amostras, em ordem inversa, sem descartar amostras ou liberar o MFT.

Se um MFT oferecer suporte à reprodução reversa não diluída, 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 estar preparado para que os carimbos de data/hora diminuam e para que os quadros delta cheguem em ordem inversa. Um decodificador normalmente precisará armazenar amostras em buffer até receber um grupo inteiro de imagens (GOP), decodificar todo o GOP e gerar a saída dos 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 deve 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 Tarifário

Buscando, avançando rápido e invertendo o jogo