Compartilhar via


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.

Tarefas básicas do DirectShow

Classe CBaseReferenceClock

Hora e relógios no DirectShow