Udostępnij przez


Źródła na żywo

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

Źródło na żywo, nazywane również źródłem wypychania , odbiera dane w czasie rzeczywistym. Przykłady obejmują przechwytywanie wideo i emisje sieciowe. Ogólnie rzecz biorąc, źródło na żywo nie może kontrolować szybkości, z jaką dane docierają.

Filtr jest uznawany za źródło na żywo, jeśli jeden z następujących warunków jest spełniony:

Jeśli filtr źródła na żywo udostępnia zegar, Menedżer filtru grafu będzie preferować ten zegar, gdy wybierze zegar referencyjny grafu. Aby uzyskać więcej informacji, zobacz Zegary referencyjne.

opóźnienia

Opóźnienie filtru to czas potrzebny na przetworzenie próbki przez filtr. W przypadku źródeł na żywo opóźnienie jest określane przez rozmiar buforu używanego do przechowywania próbek. Załóżmy na przykład, że wykres filtru ma źródło wideo z opóźnieniem 33 milisekund (ms) i źródłem audio z opóźnieniem 500 ms. Każda ramka wideo dociera do modułu renderującego wideo około 470 ms, zanim pasujący przykład audio osiągnie renderer audio. Jeśli wykres nie zrekompensowa różnicy, dźwięk i wideo nie zostaną zsynchronizowane.

Źródła na żywo można synchronizować za pomocą interfejsu IAMPushSource. Menedżer filtru programu Graph nie synchronizuje źródeł na żywo, chyba że aplikacja włączy synchronizację przez wywołanie metody IAMGraphStreams::SyncUsingStreamOffset. Jeśli synchronizacja jest włączona, Menedżer filtrów programu Graph wysyła zapytania do każdego filtru źródłowego dla IAMPushSource. Jeśli filtr obsługuje IAMPushSource, menedżer programu Graph filtru wywołuje IAMLatency::GetLatency w celu pobrania oczekiwanego opóźnienia filtru. (Interfejs IAMPushSource dziedziczy IAMLatency). Na podstawie połączonych wartości opóźnienia Menedżer filtru programu Graph określa maksymalne oczekiwane opóźnienie na wykresie. Następnie wywołuje IAMPushSource::SetStreamOffset, aby dać każdemu filtrowi źródła przesunięcie strumienia, które filtr dodaje do wygenerowanych sygnatur czasowych.

Ta metoda jest przeznaczona głównie do wersji zapoznawczej na żywo. Należy jednak pamiętać, że numer PIN podglądu na urządzeniu przechwytywania na żywo (np. aparat) nie ustawia sygnatur czasowych na próbkach, które dostarcza. W związku z tym, aby użyć tej metody z urządzeniem przechwytywania na żywo, należy wyświetlić podgląd z numeru PIN przechwytywania. Aby uzyskać więcej informacji, zobacz DirectShow Video Capture Filters.

Obecnie interfejs IAMPushSource jest obsługiwany przez filtr przechwytywania VFW oraz filtr przechwytywania dźwięku.

dopasowywanie szybkości

Jeśli filtr renderatora planuje próbki przy użyciu jednego zegara odniesienia, ale filtr źródłowy generuje je przy użyciu innego zegara, błędy mogą wystąpić w odtwarzaniu. Moduł renderowania może działać szybciej niż źródło, powodując luki w danych. Może też działać wolniej niż źródło, co powoduje, że próbki będą "wiązać się", aż w pewnym momencie wykres spadnie próbki. Zazwyczaj źródło na żywo nie może kontrolować szybkości produkcji, więc zamiast tego renderator powinien odpowiadać współczynnikom ze źródłem.

Obecnie tylko program renderujący dźwięk wykonuje dopasowywanie szybkości, ponieważ usterki w odtwarzaniu audio są bardziej zauważalne niż usterki w wideo. Aby wykonać dopasowywanie szybkości, moduł renderujący dźwięk musi wybrać coś, co będzie zgodne ze współczynnikami. Używa następującego algorytmu:

  • Jeśli wykres nie używa zegara odniesienia, program renderowany dźwięk nie próbuje dopasować stawek. (Za każdym razem, gdy wykres nie ma zegara odniesienia, próbki są zawsze renderowane natychmiast po ich nadejściu).
  • W przeciwnym razie, jeśli istnieje zegar odwołania dla grafu, moduł renderujący dźwięk sprawdza, czy istnieje źródło na żywo nadrzędne, przy użyciu opisanych wcześniej kryteriów. Jeśli nie, moduł renderowania audio nie jest zgodny ze współczynnikami.
  • Jeśli istnieje źródło na żywo nadrzędne i to źródło uwidacznia interfejs IAMPushSource na wyprowadzeniu wyjściowym, moduł renderowania audio wywołuje IAMPushSource::GetPushSourceFlags. Szuka jednej z następujących flag:
    • AM_PUSHSOURCECAPS_INTERNAL_RM. Ta flaga oznacza, że filtr źródłowy ma własny mechanizm dopasowywania szybkości, więc program renderujący dźwięk nie jest zgodny ze współczynnikami.
    • AM_PUSHSOURCECAPS_NOT_LIVE. Ta flaga oznacza, że filtr źródłowy nie jest naprawdę źródłem na żywo, mimo że uwidacznia interfejs IAMPushSource. W związku z tym program renderowany dźwięk nie jest zgodny ze współczynnikami.
    • AM_PUSHSOURCECAPS_PRIVATE_CLOCK. Ta flaga oznacza, że filtr źródłowy używa prywatnego zegara do generowania sygnatur czasowych. W tym przypadku renderator audio pasuje do stawek względem sygnatur czasowych. (Jeśli jednak próbki nie mają sygnatur czasowych, program renderowany ignoruje tę flagę).
  • Jeśli GetPushSourceFlags zwraca żadnych flag (zero), zachowanie modułu renderowania dźwięku zależy od zegara grafu i czy próbki mają sygnatury czasowe:
    • Jeśli renderer audio nie jest zegarem grafu, a próbki mają sygnatury czasowe, renderator audio pasuje do wskaźników względem sygnatur czasowych.
    • Jeśli próbki nie mają sygnatur czasowych, renderator audio próbuje dopasować szybkość przychodzących danych audio.
    • Jeśli renderer audio jest zegarem grafu, próbuje dopasować szybkość danych przychodzących.

Przyczyną ostatniego przypadku jest następująca: Jeśli renderator dźwięku jest zegarem odniesienia, a filtr źródłowy używa tego samego zegara do generowania sygnatur czasowych, renderowanie audio nie może dopasować stawek względem sygnatur czasowych. Gdyby tak było, w efekcie będzie próbował dopasować stawki z samym sobą, co może spowodować dryf zegara. W związku z tym w tym przypadku renderer odpowiada szybkości przychodzących danych dźwiękowych.

czas i zegary w DirectShow