Relógios de referência
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in 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 Gerenciador de Grafo de Filtro é sincronizar todos os filtros no grafo 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 um fallback, o Gerenciador de Grafo de Filtro pode usar a hora 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 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 grafo 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 têm a garantia de aumentar monotonicamente. Em outras palavras, os horários do relógio nunca voltarão. Se um relógio de referência estiver gerando horários 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 atualizado. Para obter mais informações, consulte Classe CBaseReferenceClock.
Relógio de referência padrão
O Gerenciador de Grafo de Filtro seleciona automaticamente um relógio de referência quando o grafo é executado. Ele usa o seguinte algoritmo para selecionar o relógio:
- Se o aplicativo tiver selecionado um relógio (veja abaixo), use esse relógio.
- Se o grafo contiver um filtro de fonte dinâmica que dê suporte a IReferenceClock, use esse filtro. Para obter a definição de uma fonte dinâmica, consulte Fontes dinâmicas.
- Se o grafo NÃO contiver filtros de fonte dinâmica, use qualquer filtro no grafo que dê suporte a IReferenceClock, começando pelos renderizadores e trabalhando upstream. Prefira filtros conectados em vez de filtros não conectados. (Se o grafo estiver renderizando um fluxo de áudio, essa 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 se baseia na hora do sistema.
Definindo o relógio de referência
Um aplicativo pode selecionar um relógio chamando o método IMediaFilter::SetSyncSource no Gerenciador do Gráfico de Filtros. Você só deve fazer isso se tiver um motivo específico para preferir outro relógio.
Você pode instruir o Gerenciador de Grafo 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 Grafo de Filtro.
Sempre que o relógio de referência é alterado, o Gerenciador do Gráfico de Filtro notifica cada filtro chamando seu método IMediaFilter::SetSyncSource . Os aplicativos nunca devem chamar esse método em filtros.
Tópicos relacionados