Udostępnij za pośrednictwem


Zegary referencyjne

[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w programie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

Jedną z funkcji Menedżera programu Filter Graph jest zsynchronizowanie wszystkich filtrów na grafie z tym samym zegarem, nazywanym zegarem odniesienia .

Każdy obiekt, który uwidacznia interfejs IReferenceClock może działać jako zegar odniesienia. Zegar referencyjny może być dostarczany przez filtr DirectShow — zazwyczaj renderator audio, który ma dostęp do czasomierza sprzętowego. Jako rezerwowy menedżer filtrów programu Graph może używać czasu systemowego.

Nominalnie zegar odniesienia mierzy czas w 100-nanosekundowych interwałach, chociaż rzeczywista dokładność zegara może być mniejsza. Aby pobrać bieżącą godzinę zegara, wywołaj metodę IReferenceClock::GetTime. Plan bazowy zegara — czas, od którego rozpoczyna się liczenie — zależy od implementacji, więc wartość zwracana przez GetTime nie jest z założenia zrozumiała. Co ma znaczenie, to różnica od momentu uruchomienia grafu.

Mimo że dokładność zegara odniesienia może się różnić, czasy zwracane przez metodę GetTime mają gwarancję zwiększenia monotonicznie. Innymi słowy, czasy zegara nigdy nie pójdą wstecz. Jeśli zegar odniesienia generuje czasy zegara ze źródła sprzętu, a zegar sprzętowy skacze do tyłu (na przykład w przypadku zmiany zegara), metoda GetTime powinna nadal zwracać ostatni zgłoszony czas, aż zegar sprzętu dogoni. Aby uzyskać więcej informacji, zobacz klasa CBaseReferenceClock.

domyślne zegara odwołania

Menedżer filtru programu Graph automatycznie wybiera zegar odwołania po uruchomieniu grafu. Używa następującego algorytmu do wybrania zegara:

  • Jeśli aplikacja wybrała zegar (patrz poniżej), użyj tego zegara.
  • Jeśli wykres zawiera filtr źródła na żywo obsługujący IReferenceClock, użyj tego filtru. Aby uzyskać definicję źródła na żywo, zobacz Źródła na żywo.
  • Jeśli wykres nie zawiera żadnych filtrów źródła na żywo, użyj dowolnego filtru na grafie, który obsługuje IReferenceClock, począwszy od rendererów i działającego nadrzędnego strumienia. Preferuj połączone filtry za pośrednictwem nie połączonych filtrów. (Jeśli graf renderuje strumień audio, ten krok w algorytmie zwykle wybiera filtr renderatora audio).
  • Jeśli żaden filtr nie zapewnia odpowiedniego zegara, użyj zegara odniesienia systemu, który jest oparty na czasie systemowym.

ustawianie zegara odwołania

Aplikacja może wybrać zegar, wywołując metodę IMediaFilter::SetSyncSource w Menedżerze programu Graph Filter. Należy to zrobić tylko wtedy, gdy masz określony powód, aby preferować inny zegar.

Możesz poinstruować Menedżera filtrów programu Graph, aby nie używał zegara odwołania, wywołując SetSyncSource z wartością NULL. Na przykład możesz to zrobić, aby przetwarzać próbki tak szybko, jak to możliwe. Aby przywrócić domyślny zegar odwołania, wywołaj metodę IFilterGraph::SetDefaultSyncSource w Menedżerze filtrów programu Graph.

Za każdym razem, gdy zegar odwołania zmieni się, Menedżer filtru programu Graph powiadamia każdy filtr, wywołując jego IMediaFilter::SetSyncSource metody. Aplikacje nigdy nie powinny wywoływać tej metody w filtrach.

ustawianie zegara grafu

czas i zegary w DirectShow