Delen via


De grafiekklok instellen

[De functie die is gekoppeld aan deze pagina, DirectShow, is een verouderde functie. Het is vervangen door MediaPlayer, IMFMediaEngineen Audio/Video Capture in Media Foundation. Deze functies zijn geoptimaliseerd voor Windows 10 en Windows 11. Microsoft raadt ten zeerste aan om nieuwe code te gebruiken MediaPlayer, IMFMediaEngine en Audio/Video Capture in Media Foundation in plaats van DirectShow, indien mogelijk. Microsoft stelt voor dat bestaande code die gebruikmaakt van de verouderde API's, indien mogelijk opnieuw worden geschreven om de nieuwe API's te gebruiken.]

Wanneer u een filtergrafiek maakt, kiest Filter Graph Manager automatisch een verwijzingsklok voor de grafiek. Alle filters in de grafiek worden gesynchroniseerd met de verwijzingsklok. Met name rendererfilters gebruiken de verwijzingsklok om de presentatietijd van elk voorbeeld te bepalen.

Er is meestal geen reden voor een toepassing om de keuze van de verwijzingsklok van Filter Graph Manager te overschrijven. U kunt dit echter doen door de methode IMediaFilter::SetSyncSource in Filter Graph Manager aan te roepen. Deze methode gebruikt een aanwijzer naar de IReferenceClock-interface van de klok. Roep de methode aan terwijl de grafiek is gestopt.

Als een filter een klok biedt, kunt u de IReferenceClock aanwijzer verkrijgen door op het filter QueryInterface aan te roepen. U kunt ook een externe verwijzingsklok implementeren die niet wordt geleverd door een filter, zolang uw externe klok IReferenceClock-implementeert. In het volgende voorbeeld ziet u hoe u een klok instelt.

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

In dit voorbeeld wordt ervan uitgegaan dat CreateMyPrivateClock een door de toepassing gedefinieerde functie is die een klok maakt en een IReferenceClock aanwijzer retourneert.

U kunt ook instellen dat de filtergrafiek zonder klok wordt uitgevoerd door SetSyncSource- aan te roepen met de waarde NULL-. Als er geen klok is, wordt de grafiek zo snel mogelijk uitgevoerd. Zonder klok wachten rendererfilters niet op de presentatietijd van een voorbeeld. In plaats daarvan geven ze elk voorbeeld weer zodra het binnenkomt. Het instellen van de grafiek die zonder klok wordt uitgevoerd, is handig als u gegevens snel wilt verwerken in plaats van deze in realtime te bekijken.

Basic DirectShow-taken

CBaseReferenceClock-klasse

Tijd en Klokken in DirectShow