Sdílet prostřednictvím


Referenční hodiny

[Funkce přidružená k této stránce DirectShow je starší funkce. Byla nahrazena MediaPlayer, MMFMediaEnginea Audio/Video Capture v Media Foundation. Tyto funkce jsou optimalizované pro Windows 10 a Windows 11. Microsoft důrazně doporučuje, aby nový kód používal MediaPlayer, MMFMediaEngine a Audio/Video Capture v Media Foundation místo DirectShow, pokud je to možné. Microsoft navrhuje, aby se stávající kód, který používá starší rozhraní API, přepsal, aby se nová rozhraní API používala, pokud je to možné.]

Jednou z funkcí Správce grafů filtru je synchronizovat všechny filtry v grafu se stejnými hodinou, označovanou jako referenční hodiny.

Jakýkoli objekt, který zveřejňuje IReferenceClock rozhraní, může fungovat jako referenční hodiny. Referenční hodiny mohou být poskytovány filtrem DirectShow – obvykle zvukovým rendererem, který má přístup k časovači hardwaru. Jako záložní způsob může Správce grafů filtru používat systémový čas.

Referenční hodiny měří čas v 100 nanosekundových intervalech, i když skutečná přesnost hodin může být menší. Pokud chcete načíst aktuální čas hodin, zavolejte metodu IReferenceClock::GetTime. Směrný plán hodin – čas, od kterého začíná počítat – závisí na implementaci, takže hodnota vrácená GetTime není ze své podstaty smysluplná. Záleží na rozdílu od spuštění grafu.

I když se přesnost referenčních hodin může lišit, je zaručeno, že časy vrácené metodou getTimemonotonicky zvýší. Jinými slovy, časy hodin se nikdy nevrátí zpět. Pokud referenční hodiny generují hodiny ze zdroje hardwaru a hardwarové hodiny přeskakují dozadu (například pokud dojde k úpravě hodin), měla by metoda GetTime pokračovat v vrácení posledního hlášeného času, dokud hardwarové hodiny nezachytí. Další informace naleznete v tématu CBaseReferenceClock Třída.

výchozí referenční hodin

Správce grafů filtru automaticky vybere referenční hodiny při spuštění grafu. K výběru hodin používá následující algoritmus:

  • Pokud aplikace vybrali hodiny (viz níže), použijte tyto hodiny.
  • Pokud graf obsahuje živý zdrojový filtr, který podporuje IReferenceClock , použijte tento filtr. Definice živého zdroje naleznete v tématu Živé zdroje.
  • Pokud graf neobsahuje žádné živé zdrojové filtry, použijte jakýkoli filtr v grafu, který podporuje IReferenceClock, počínaje renderery a pracovat v upstreamu. Upřednostněte propojené filtry před nepřipojenými filtry. (Pokud graf vykresluje zvukový stream, tento krok v algoritmu obvykle vybere filtr rendereru zvuku.)
  • Pokud žádný filtr neposkytuje vhodné hodiny, použijte systémové referenční hodiny, který je založen na systémovém čase.

Nastavení referenčních hodin

Aplikace může vybrat hodiny voláním metody IMediaFilter::SetSyncSource ve Správci grafů filtru. To byste měli udělat pouze v případě, že máte konkrétní důvod preferovat jiné hodiny.

Správci grafů filtru můžete dát pokyn, aby nepoužít referenční hodiny voláním SetSyncSource s hodnotou NULL. Můžete to například udělat, abyste co nejrychleji zpracovávali vzorky. Chcete-li obnovit výchozí referenční hodiny, zavolejte IFilterGraph::SetDefaultSyncSource metodu ve Správci grafů filtru.

Kdykoli se změní referenční hodiny, Správce grafů filtru upozorní každý filtr voláním jeho IMediaFilter::SetSyncSource metoda. Aplikace by nikdy neměly volat tuto metodu pro filtry.

Nastavení hodin grafu

čas a hodiny v DirectShow