Partilhar via


Definindo o relógio gráfico

[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.]

Quando você cria um gráfico de filtro, o Gerenciador de Gráficos de Filtros escolhe automaticamente um relógio de referência para o gráfico. Todos os filtros no gráfico são sincronizados com o relógio de referência. Em particular, os filtros do renderizador usam o relógio de referência para determinar o tempo de apresentação de cada amostra.

Normalmente, não há razão para um aplicativo substituir a escolha do relógio de referência do Filter Graph Manager. No entanto, você pode fazer isso chamando o IMediaFilter::SetSyncSource método no Filter Graph Manager. Esse método leva um ponteiro para a interface IReferenceClock do relógio. Chame o método enquanto o gráfico está parado.

Se um filtro fornecer um relógio, 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 seu 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 gráfico de filtro para ser executado sem relógio, chamando SetSyncSource com o valor NULL. Se não houver relógio, o gráfico é executado o mais rápido possível. Sem relógio, os filtros do renderizador não esperam pela hora de apresentação de uma amostra. Em vez disso, eles renderizam cada amostra assim que ela chega. Definir o gráfico para ser executado sem um relógio é útil se você quiser processar dados rapidamente, em vez de visualizá-los em tempo real.

tarefas básicas do DirectShow

CBaseReferenceClock Classe

Tempo e Relógios no DirectShow