Partilhar via


Relógio de Apresentação

O relógio de apresentação é um objeto que gera a hora do relógio para uma apresentação. A hora informada pelo relógio de apresentação é chamada de hora de apresentação. Todos os fluxos em uma apresentação são sincronizados com o tempo de apresentação. O relógio de apresentação expõe as seguintes interfaces.

Interface Descrição
IMFPresentationClock Interface primária para usar o relógio de apresentação.
IMFRateControl Controla a taxa de relógio.
IMFTimer Fornece um retorno de chamada de temporizador.
FMIhutdown Desliga o relógio de apresentação.

 

Os coletores de mídia usam o tempo de apresentação para agendar quando renderizar amostras. Sempre que um coletor de mídia recebe uma nova amostra, ele obtém o carimbo de data/hora da amostra e renderiza a amostra no momento indicado, ou o mais próximo possível desse tempo. Como todos os coletores de mídia em uma topologia compartilham o mesmo relógio de apresentação, vários fluxos (como áudio e vídeo) são sincronizados. Fontes de mídia e transformações não usam o relógio de apresentação, porque não agendam quando entregar amostras. Em vez disso, eles produzem amostras sempre que o pipeline solicita uma nova amostra.

Se você estiver usando a Sessão de Mídia para reprodução, a Sessão de Mídia manipulará todos os detalhes da criação do relógio de apresentação, da seleção de uma fonte de tempo e da notificação dos coletores de mídia. Seu aplicativo pode usar o relógio de apresentação para obter o tempo de apresentação atual durante a reprodução, mas, caso contrário, não chamará nenhum método no relógio de apresentação.

Hora do relógio e estados do relógio

Para obter a hora do relógio mais recente do relógio de apresentação, ligue IMFPresentationClock::GetTime. Os tempos de relógio são sempre em unidades de 100 nanossegundos, então um segundo é 10.000.000 (10^7) ticks. Isto corresponde a uma frequência de 10 MHz.

O relógio de apresentação tem três estados: Em execução, pausado e parado.

  • Para executar o relógio, ligue IMFPresentationClock::Start. O método Start especifica a hora de início do relógio. Enquanto o relógio está em execução, o tempo do relógio aumenta a partir da hora de início, na taxa de relógio atual.
  • Para pausar o relógio, chame IMFPresentationClock::P ause. Enquanto o relógio está pausado, a hora do relógio não avança e GetTime retorna a hora em que o relógio foi pausado.
  • Para parar o relógio, ligue IMFPresentationClock::Stop. Quando o relógio é parado, a hora do relógio não avança e GetTime retorna zero.

Por padrão, o relógio avança a uma taxa de 1,0, o que significa 1 tick por 100 nanossegundos. Para alterar a taxa na qual o relógio avança, consulte o relógio de apresentação para a interfaceIMFRateControle chame IMFRateControl::SetRate.

Os objetos podem receber notificações de alterações de estado (incluindo alterações de taxa) do relógio de apresentação. Para receber notificações, implemente a interface IMFClockStateSink e chame IMFPresentationClock::AddClockStateSink no relógio de apresentação. Antes de desligar, chame IMFPresentationClock::RemoveClockStateSink para cancelar o registro do objeto. Os coletores de mídia usam esse mecanismo para receber notificações do relógio.

Horários de Apresentação

Um coletor de mídia tenta agendar cada amostra para que a amostra seja renderizada no momento correto ou o mais próximo possível da hora correta. Aplicam-se as seguintes definições:

  • Tempo de apresentação. A hora em que uma amostra deve ser renderizada. O tempo é dado em unidades de 100 nanossegundos.
  • Tempo de mídia. Tempo relativo ao início do conteúdo. Por exemplo, se um arquivo de vídeo tiver 10 segundos de duração, o ponto na metade do arquivo terá um tempo de mídia de 5 segundos.
  • Carimbo de data/hora. A hora marcada em uma amostra de mídia. Para obter o carimbo de data/hora, ligue IMFSample::GetSampleTime. Quando uma fonte de mídia produz uma amostra, ela define o carimbo de data/hora igual ao tempo da mídia. A Sessão de Mídia traduz o carimbo de data/hora em tempo de apresentação.

Por padrão, o tempo de mídia e o tempo de apresentação são os mesmos, por exemplo, se um quadro de vídeo aparece 5 segundos no arquivo de origem, o tempo de mídia e o tempo de apresentação são ambos 5 segundos. Se você estiver usando o Sequencer Source, o modelo de temporização é um pouco mais complicado, para permitir transições suaves entre segmentos. Para obter mais informações sobre o modelo de temporização da fonte do sequenciador, consulte Sequence Presentation Times.

A fonte de mídia sempre define o carimbo de data/hora igual ao tempo de mídia. Se o tempo de apresentação não estiver alinhado com o tempo de mídia, a Sessão de mídia converte os carimbos de data/hora nas amostras de mídia. No momento em que o coletor recebe uma amostra, o carimbo de data/hora da amostra foi convertido em tempo de apresentação. O coletor agenda a amostra em relação à hora atual do relógio de apresentação. (Pias sem taxa são uma exceção, porque ignoram o relógio de apresentação.)

Se o aplicativo procurar uma nova posição, a Sessão de Mídia reinicia o relógio de apresentação no horário de busca especificado. Por exemplo, se o aplicativo procura a posição de 5 segundos no arquivo, a sessão de mídia inicia o relógio em 5 segundos. A fonte de mídia pode entregar amostras com um carimbo de data/hora um pouco anterior se o tempo de busca não cair em um limite de quadro-chave. Isso é necessário para que os decodificadores possam decodificar todos os quadros. A Sessão de Mídia solta ou corta amostras antes que elas cheguem aos coletores de mídia, a fim de corresponder ao tempo de busca solicitado. Por exemplo, se o tempo de pesquisa for de 5 segundos, a primeira amostra de áudio pode começar em 4,5 segundos. A Sessão de Mídia cortará os primeiros 0,5 segundos da primeira amostra de áudio decodificada.

Criando o relógio de apresentação

Para criar o relógio de apresentação, chame MFCreatePresentationClock. Para desligar o relógio, consulte a interfaceIMFShutdown e chame IMFShutdown::Shutdown. O chamador de MFCreatePresentationClock é responsável por chamar de desligamento; na maioria dos casos, esta é a sessão de mídia em vez do aplicativo.

Fontes de tempo de apresentação

Apesar do nome, o relógio de apresentação não implementa um relógio. Em vez disso, ele obtém os tempos de relógio de outro objeto, chamado de fonte de tempo de apresentação . A fonte de tempo pode ser qualquer objeto que gere ticks de relógio precisos e exponha a interfaceIMFPresentationTimeSource. A ilustração a seguir mostra esse processo.

diagrama mostrando a relação entre o relógio de apresentação e a fonte de tempo de apresentação

Quando o relógio de apresentação é criado pela primeira vez, ele não tem uma fonte de tempo. Para definir a fonte de tempo, chame IMFPresentationClock::SetTimeSource com um ponteiro para a interface de IMFPresentationTimeSource da fonte de tempo. Uma fonte de tempo suporta os mesmos estados que o relógio de apresentação (em execução, pausado e parado) e deve implementar o interface IMFClockStateSink. O relógio de apresentação usa essa interface para notificar a fonte de tempo quando alterar o estado. Desta forma, a fonte de tempo fornece os ticks do relógio, mas o relógio de apresentação inicia as mudanças de estado no relógio.

Alguns coletores de mídia têm acesso a um relógio preciso e, portanto, expõem a interfaceIMFPresentationTimeSource. Em particular, o renderizador de áudio pode usar a frequência da placa de som como um relógio. Na reprodução de áudio, é útil para o renderizador de áudio atuar como a fonte de tempo, para que o vídeo seja sincronizado com a taxa de reprodução de áudio. Isso geralmente produz melhores resultados do que tentar combinar o áudio com um relógio externo.

Media Foundation também fornece uma fonte de tempo de apresentação com base no relógio do sistema. Para criar esse objeto, chame MFCreateSystemTimeSource. A fonte de tempo do sistema pode ser usada quando nenhum coletor de mídia fornece uma fonte de tempo.

Em geral, um coletor de mídia deve usar o relógio de apresentação fornecido a ele, independentemente da fonte de tempo usada pelo relógio de apresentação. Esta regra aplica-se mesmo quando um coletor de mídia implementa IMFPresentationTimeSource. Se o relógio de apresentação usar alguma outra fonte de tempo, o coletor de mídia deve seguir essa fonte de tempo, não seu próprio relógio interno.

Há duas situações em que um coletor de mídia não seguirá o relógio de apresentação:

  • Alguns sumidouros de mídia são sem taxa. Se um coletor de mídia não tiver taxa, ele consome amostras o mais rápido possível, sem programá-las de acordo com o relógio de apresentação. Normalmente, coletores sem taxa gravam dados em um arquivo, por isso é desejável concluir a operação o mais rápido possível. Um coletor sem taxa retorna o sinalizador de MEDIASINK_RATELESS em seu método IMFMediaSink::GetCharacteristics. Quando todos os coletores em uma topologia não têm taxa, a Sessão de Mídia envia dados pelo pipeline o mais rápido possível.

  • Alguns dissipadores de mídia não podem corresponder às taxas com uma fonte de tempo diferente de si mesmos. Em caso afirmativo, o coletor retorna o sinalizador de MEDIASINK_CANNOT_MATCH_CLOCK em seu GetCharacteristics método. O pipeline ainda pode usar outra fonte de tempo, mas os resultados serão menos do que ideais. A pia provavelmente ficará para trás e causará falhas durante a reprodução.

APIs do Media Foundation Platform