Partilhar via


Relógios de referência

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o novo código utilize MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Uma função do Filter Graph Manager é sincronizar todos os filtros no gráfico com o mesmo relógio, chamado de relógio de referência .

Qualquer objeto que exponha a interface IReferenceClock pode atuar como o relógio de referência. O relógio de referência pode ser fornecido por um filtro DirectShow — normalmente o renderizador de áudio, que tem acesso a um temporizador de hardware. Como fallback, o Filter Graph Manager pode usar o tempo do sistema.

Nominalmente, um relógio de referência mede o tempo em intervalos de 100 nanossegundos, embora a precisão real do relógio possa ser menor. Para recuperar a hora atual do relógio, chame o método IReferenceClock::GetTime. A linha de base do relógio — a hora a partir da qual ele começa a contar — depende da implementação, portanto, o valor retornado por GetTime não é inerentemente significativo. O que importa é o delta de quando o gráfico começou a ser executado.

Embora a precisão de um relógio de referência possa variar, os tempos retornados pelo método GetTime são garantidos para aumentar monotonicamente. Por outras palavras, os tempos do relógio nunca vão retroceder. Se um relógio de referência estiver gerando tempos de relógio de uma fonte de hardware e o relógio de hardware saltar para trás (por exemplo, se houver um ajuste no relógio), o método GetTime deverá continuar a retornar a última hora relatada até que o relógio de hardware seja recuperado. Para obter mais informações, consulte CBaseReferenceClock Class.

Relógio de referência padrão

O Filter Graph Manager seleciona automaticamente um relógio de referência quando o gráfico é executado. Ele usa o seguinte algoritmo para selecionar o relógio:

  • Se o aplicativo selecionou um relógio (veja abaixo), use esse relógio.
  • Se o gráfico contiver um filtro de fonte ativa que suporte IReferenceClock , use esse filtro. Para obter a definição de uma fonte ativa, consulte Live Sources.
  • Se o gráfico NÃO contiver nenhum filtro de origem ao vivo, use qualquer filtro no gráfico que suporte IReferenceClock , começando pelos renderizadores e trabalhando a montante. Prefira filtros conectados em vez de filtros desconectados. (Se o gráfico estiver renderizando um fluxo de áudio, esta etapa no algoritmo normalmente selecionará o filtro do renderizador de áudio.)
  • Se nenhum filtro fornecer um relógio adequado, use o Relógio de Referência do Sistema, que é baseado na hora do sistema.

Ajustar o relógio de referência

Um aplicativo pode selecionar um relógio chamando o método IMediaFilter::SetSyncSource no Gerenciador de gráficos de filtro. Deve fazê-lo apenas se tiver uma razão específica para preferir outro relógio.

Você pode instruir o Gerenciador de Gráficos de Filtro a não usar um relógio de referência chamando SetSyncSource com o valor NULL. Por exemplo, você pode fazer isso para processar amostras o mais rápido possível. Para restaurar o relógio de referência padrão, chame o método IFilterGraph::SetDefaultSyncSource no Gerenciador de gráficos de filtro.

Sempre que o relógio de referência muda, o Filter Graph Manager notifica cada filtro chamando seu IMediaFilter::SetSyncSource método. Os aplicativos nunca devem chamar esse método em filtros.

Definindo o relógio gráfico

hora e relógios no DirectShow