Delen via


Verwijzingsklokken

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

Een functie van Filter Graph Manager is om alle filters in de grafiek te synchroniseren met dezelfde klok, de verwijzingsklok genoemd.

Elk object dat de IReferenceClock interface beschikbaar maakt, kan fungeren als de klokverwijzing. De verwijzingsklok kan worden geleverd door een DirectShow-filter, meestal de audio-renderer, die toegang heeft tot een hardwaretimer. Als terugval kan Filter Graph Manager de systeemtijd gebruiken.

Nominaal meet een verwijzingsklok de tijd in intervallen van 100 nanoseconden, hoewel de werkelijke nauwkeurigheid van de klok minder kan zijn. Als u de huidige tijd van de klok wilt ophalen, roept u de methode IReferenceClock::GetTime aan. De basislijn van de klok, de tijd vanaf waaruit de klok begint te tellen, is afhankelijk van de implementatie, dus de waarde die wordt geretourneerd door GetTime- is niet inherent zinvol. Wat belangrijk is, is de delta vanaf het moment dat de grafiek werd uitgevoerd.

Hoewel de nauwkeurigheid van een verwijzingsklok kan variƫren, zijn de tijden die worden geretourneerd door de methode GetTime gegarandeerd monotonisch te verhogen. Met andere woorden, kloktijden zullen nooit achteruit gaan. Als een verwijzingsklok kloktijden genereert van een hardwarebron en de hardwareklok achteruit springt (bijvoorbeeld als er een aanpassing aan de klok is), moet de methode GetTime- de laatst gerapporteerde tijd blijven retourneren totdat de hardwareklok ophaalt. Zie CBaseReferenceClock Classvoor meer informatie.

standaardreferentieklok

Filter Graph Manager selecteert automatisch een verwijzingsklok wanneer de grafiek wordt uitgevoerd. Het gebruikt het volgende algoritme om de klok te selecteren:

  • Als de toepassing een klok heeft geselecteerd (zie hieronder), gebruikt u die klok.
  • Als de grafiek een livebronfilter bevat dat ondersteuning biedt voor IReferenceClock, gebruikt u dat filter. Zie livebronnenvoor de definitie van een livebron.
  • Als de grafiek geen livebronfilters bevat, gebruikt u een filter in de grafiek die ondersteuning biedt voor IReferenceClock, te beginnen bij de renderers en upstream te werken. Geef de voorkeur aan verbonden filters boven niet-verbonden filters. (Als de grafiek een audiostream weergeeft, selecteert deze stap in het algoritme normaal gesproken het filter voor de audiorendeer.)
  • Als geen filter een geschikte klok biedt, gebruikt u de Systeemreferentieklok, die is gebaseerd op de systeemtijd.

de verwijzingsklok instellen

Een toepassing kan een klok selecteren door de methode IMediaFilter::SetSyncSource op filtergrafiekbeheer aan te roepen. U moet dit alleen doen als u een bepaalde reden hebt om een andere klok te geven.

U kunt filtergrafiekbeheer instrueren geen verwijzingsklok te gebruiken door SetSyncSource- aan te roepen met de waarde NULL-. U kunt dit bijvoorbeeld doen om voorbeelden zo snel mogelijk te verwerken. Als u de standaardklok wilt herstellen, roept u de IFilterGraph::SetDefaultSyncSource methode aan in Filter Graph Manager.

Wanneer de verwijzingsklok verandert, wordt elk filter door Filter Graph Manager op de hoogte gesteld door de methode IMediaFilter::SetSyncSource aan te roepen. Toepassingen mogen deze methode nooit aanroepen voor filters.

grafiekklok instellen

tijd en klokken in DirectShow