Partilhar via


Implementando 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 Rate Control.

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. (Consulte Service Interfaces.)
  3. Implemente a interface IMFRateSupport, que obtém as taxas de reprodução suportadas pelo objeto.
  4. Implemente a interface IMFRateControl, que controla ou define a velocidade de reprodução.

Fontes de mídia

Se uma fonte de mídia oferecer suporte ao controle de taxa, ela deverá implementar tanto IMFRateSupport quanto IMFRateControl . Caso contrário, a sessão multimédia informa que a velocidade de reprodução mínima e máxima é de 1,0, independentemente de quais outros componentes estão na cadeia de processamento.

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 os seus carimbos de tempo. Em vez disso, o relógio de apresentação funciona a uma velocidade mais rápida ou mais lenta. Para reprodução inversa, a fonte entrega amostras em ordem inversa, com marcas temporais decrescentes.

O parâmetro fThin do IMFRateControl::SetRate indica se a fonte de mídia deve fina o conteúdo. A redução aplica-se principalmente a fluxos de vídeo. No modo diluído, a fonte descarta quadros delta e entrega apenas quadros-chave. Com taxas de reprodução muito altas, a fonte pode ignorar alguns quadros-chave (por exemplo, entregar todos os outros quadros-chave).

A fonte não precisa soltar amostras de áudio no modo diluído. Com taxas de reprodução muito altas, no entanto, a fonte pode não ser capaz de ler dados com rapidez suficiente para satisfazer as solicitações de amostra do pipeline. Nesse caso, a fonte pode precisar descartar algum dado de áudio. Em caso afirmativo, ele deve tentar entregar amostras de áudio próximas no tempo das amostras de vídeo (supondo que a fonte tenha ambos os tipos de fluxo).

Quando um fluxo transita entre o modo diluído e não diluído, ele envia um evento de MEStreamThinMode.

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

Durante a reprodução inversa:

  • 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. Após cada fluxo de mídia entregar a primeira amostra no fluxo (ou seja, tempo de apresentação = 0), ele envia o evento MEEndOfStream.

Fundação de mídia transforma

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

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

  • O MFT suporta taxas de reprodução arbitrárias para reprodução avançada, diluídas e não diluídas.
  • O MFT suporta reprodução reversa diluída, mas não suporta reprodução reversa não diluída.

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

Reprodução inversa

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

Se uma MFT não expor a interfaceIMFRateSupport, a Sessão de Mídia usará de diluição para reprodução reversa, da seguinte maneira:

  • A Sessão de Multimédia envia quadros-chave para o MFT da maneira usual, chamando IMFTransform::ProcessInput.

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

  • Entre cada amostra, a Sessão Multimédia limpa o MFT, para evitar erros causados pelo facto de os timestamps estarem a diminuir.

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 a MFT implementar IMFRateSupport, a Sessão de Mídia usará essa interface para descobrir se a MFT suporta reprodução reversa não diluída. Se o MFT suporta reprodução reversa sem diluição, a Media Session fornece todas as amostras, na ordem inversa, sem perder amostras ou esvaziar o MFT.

Se um MFT suportar reprodução reversa não diluída, ele deve implementar o IMFRateControl interface. A Sessão de Multimédia usará esta interface para notificar o MFT quando ocorrer reprodução reversa. Nesse ponto, o MFT deve estar preparado para que os marcadores temporais 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), em seguida, decodificar todo o GOP e produzir os quadros decodificados na ordem correta (inversa).

Dissipadores de mídia

Se um coletor de mídia estiver sem taxa , a Sessão de mídia assumirá 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 muda, o relógio de apresentação chama o método IMFClockStateSink::OnClockSetRate do coletor de mídia.

Controlo de Taxa

Busca, avanço rápido e jogo reverso