Compartir a través de


Establecer el reloj del grafo

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Al crear un gráfico de filtro, Filter Graph Manager elige automáticamente un reloj de referencia para el gráfico. Todos los filtros del gráfico se sincronizan con el reloj de referencia. En concreto, los filtros del representador usan el reloj de referencia para determinar el tiempo de presentación de cada ejemplo.

Normalmente, no hay ninguna razón para que una aplicación invalide la elección del reloj de referencia de Filter Graph Manager. Sin embargo, puede hacerlo llamando al método IMediaFilter::SetSyncSource en el Administrador de gráficos de filtros. Este método toma un puntero a la interfaz IReferenceClock del reloj. Llame al método mientras se detiene el gráfico.

Si un filtro proporciona un reloj, puede obtener el puntero IReferenceClock llamando a QueryInterface en el filtro. Como alternativa, puede implementar un reloj de referencia externo que no se proporciona mediante un filtro, siempre y cuando el reloj externo implemente IReferenceClock. En el ejemplo siguiente se muestra cómo especificar un reloj:

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();
}

En este ejemplo se supone que CreateMyPrivateClock es una función definida por la aplicación que crea un reloj y devuelve un puntero IReferenceClock .

También puede establecer el gráfico de filtro para que se ejecute sin reloj llamando a SetSyncSource con el valor NULL. Si no hay ningún reloj, el gráfico se ejecuta lo más rápido posible. Sin reloj, los filtros del representador no esperan el tiempo de presentación de una muestra. En su lugar, representan cada muestra en cuanto llega. Establecer el grafo para que se ejecute sin un reloj es útil si desea procesar datos rápidamente, en lugar de obtener una vista previa en tiempo real.

Tareas básicas de DirectShow

CBaseReferenceClock (clase)

Hora y reloj en DirectShow