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 na 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 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 Gerenciador de Grafo de Filtro é sincronizar todos os filtros no grafo com o mesmo relógio, chamado 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 do Grafo de Filtro 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 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 horários retornados pelo métodoGetTimesão garantidos para aumentar monotonicamente. Em outras palavras, os tempos de relógio nunca voltarão. Se um relógio de referência estiver gerando horários de relógio a partir 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 hora relatada pela última vez até que o relógio de hardware apanha. Para obter mais informações, consulte classe CBaseReferenceClock.
de 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 origem dinâmica que dê suporte a IReferenceClock, use esse filtro. Para obter a definição de uma fonte dinâmica, consulte Live Sources.
- Se o grafo não contiver filtros de origem 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 do relógio de referência do sistema, que se baseia na hora do sistema.
definir o relógio de referência
Um aplicativo pode selecionar um relógio chamando o método IMediaFilter::SetSyncSource no Gerenciador de Grafo de Filtro. Você só deve fazer isso se tiver um motivo específico para preferir outro relógio.
Você pode instruir o Gerenciador de Grafos 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 do Grafo de Filtro.
Sempre que o relógio de referência é alterado, o Gerenciador de Grafo de Filtro notifica cada filtro chamando seu método IMediaFilter::SetSyncSource. Os aplicativos nunca devem chamar esse método em filtros.
Tópicos relacionados
-
definir o do Relógio do Graph