Definindo o relógio do grafo
[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.]
Quando você cria um grafo de filtro, o Gerenciador de Grafo de Filtro escolhe automaticamente um relógio de referência para o grafo. Todos os filtros no grafo são sincronizados com o relógio de referência. Em particular, os filtros de renderizador usam o relógio de referência para determinar o tempo de apresentação de cada amostra.
Geralmente, não há nenhum motivo para um aplicativo substituir o relógio de referência de escolha do Gerenciador de Gráficos de Filtro. No entanto, você pode fazer isso chamando o método IMediaFilter::SetSyncSource no Gerenciador do Gráfico de Filtros. Esse método usa um ponteiro para a interface IReferenceClock do relógio. Chame o método enquanto o grafo é interrompido.
Se um filtro fornecer um relógio, você poderá obter o ponteiro IReferenceClock chamando QueryInterface no filtro. Como alternativa, você pode implementar um relógio de referência externo que não é fornecido por um filtro, desde que o relógio externo implemente IReferenceClock. O exemplo a seguir mostra como especificar um relógio:
IGraphBuilder *pGraph = 0;
IReferenceClock *pClock = 0;
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
// Build the graph.
pGraph->RenderFile(L"C:\\Example.avi", 0);
// Create your clock.
hr = CreateMyPrivateClock(&pClock);
if (SUCCEEDED(hr))
{
// Set the graph clock.
IMediaFilter *pMediaFilter = 0;
pGraph->QueryInterface(IID_IMediaFilter, (void**)&pMediaFilter);
pMediaFilter->SetSyncSource(pClock);
pClock->Release();
pMediaFilter->Release();
}
Este exemplo pressupõe que CreateMyPrivateClock é uma função definida pelo aplicativo que cria um relógio e retorna um ponteiro IReferenceClock .
Você também pode definir o grafo de filtro para ser executado sem relógio, chamando SetSyncSource com o valor NULL. Se não houver relógio, o grafo será executado o mais rápido possível. Sem relógio, os filtros de renderizador não esperam o tempo de apresentação de um exemplo. Em vez disso, eles renderizam cada amostra assim que ela chega. Definir o grafo para ser executado sem um relógio será útil se você quiser processar dados rapidamente, em vez de visualizá-los em tempo real.
Tópicos relacionados