Partager via


Définition de l’horloge graphe

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Lorsque vous générez un graphe de filtre, le Gestionnaire de graphe de filtre choisit automatiquement une horloge de référence pour le graphe. Tous les filtres du graphique sont synchronisés avec l’horloge de référence. En particulier, les filtres de convertisseur utilisent l’horloge de référence pour déterminer l’heure de présentation de chaque exemple.

Il n’y a généralement aucune raison pour qu’une application remplace l’horloge de référence choisie par filter Graph Manager. Toutefois, vous pouvez le faire en appelant la méthode IMediaFilter::SetSyncSource sur le Gestionnaire de graphes de filtre. Cette méthode prend un pointeur vers l’interface IReferenceClock de l’horloge. Appelez la méthode pendant que le graphique est arrêté.

Si un filtre fournit une horloge, vous pouvez obtenir le pointeur IReferenceClock en appelant QueryInterface sur le filtre. Vous pouvez également implémenter une horloge de référence externe qui n’est pas fournie par un filtre, tant que votre horloge externe implémente IReferenceClock. L’exemple suivant montre comment spécifier une horloge :

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

Cet exemple suppose que CreateMyPrivateClock est une fonction définie par l’application qui crée une horloge et retourne un pointeur IReferenceClock .

Vous pouvez également définir le graphe de filtre pour qu’il s’exécute sans horloge, en appelant SetSyncSource avec la valeur NULL. S’il n’y a pas d’horloge, le graphique s’exécute aussi rapidement que possible. Sans horloge, les filtres de convertisseur n’attendent pas l’heure de présentation d’un exemple. Au lieu de cela, ils restituent chaque échantillon dès qu’il arrive. Il est utile de définir le graphe pour qu’il s’exécute sans horloge si vous souhaitez traiter les données rapidement, plutôt que de les prévisualiser en temps réel.

Tâches directshow de base

CBaseReferenceClock, classe

Heure et horloges dans DirectShow