Udostępnij przez


Krok 1. Wybieranie klasy bazowej

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

To jest krok 1 samouczka Pisanie Filtrów Przekształceń.

Przy założeniu, że zdecydujesz się napisać filtr, a nie dmO, pierwszym krokiem jest wybranie klasy bazowej do użycia. Następujące klasy są odpowiednie dla filtrów przekształcania:

  • CTransformFilter jest przeznaczony do przekształcających filtrów, które używają oddzielnych buforów wejściowych i wyjściowych. Ten rodzaj filtru jest czasami nazywany filtrem kopiująco-przekształcającym. Gdy filtr kopii-przekształcenia odbiera egzemplarz danych wejściowych, zapisuje nowe dane w egzemplarzu danych wyjściowych i dostarcza egzemplarz danych wyjściowych do następnego filtru.

  • CTransInPlaceFilter jest przeznaczony dla filtrów modyfikujących dane w oryginalnym buforze, nazywanych również filtrami trans-in-place. Gdy filtr trans-in-place odbiera próbkę, zmienia dane w tej próbce i dostarcza ją dalej. Wejściowy pin i wyjściowy pin filtru zawsze łączą się z odpowiednimi typami multimediów.

  • CVideoTransformFilter jest przeznaczony głównie dla dekodatorów wideo. Pochodzi on z CTransformFilter, ale zawiera funkcjonalność pomijania klatek, jeśli podrzędny moduł renderujący pozostaje w tyle.

  • CBaseFilter jest ogólną klasą filtru. Pozostałe klasy na tej liście pochodzą z CBaseFilter. Jeśli żadna z nich nie jest odpowiednia, możesz wrócić do tej klasy. Jednak ta klasa wymaga również największej pracy ze swojej strony.

  • ! [Ważne]

    Przekształcenia wideo w miejscu mogą mieć poważny wpływ na wydajność renderowania. Przekształcenia w miejscu wymagają operacji odczytu-modyfikacji-zapisu w buforze. Jeśli pamięć znajduje się na karcie graficznej, operacje odczytu są znacznie wolniejsze. Ponadto nawet przekształcenie kopiowania może spowodować niezamierzone operacje odczytu, jeśli to działanie nie zostanie starannie zaimplementowane. W związku z tym należy zawsze wykonywać testy wydajnościowe, jeśli piszesz przekształcenie wideo.

     

Najlepszym wyborem dla przykładowego kodera RLE jest CTransformFilter lub CVideoTransformFilter. W rzeczywistości różnice między nimi są w dużej mierze wewnętrzne, więc łatwo jest przekonwertować z jednej na drugą. Ponieważ typy multimediów muszą być różne na dwóch pinach, klasa CTransInPlaceFilter nie jest odpowiednia dla tego filtra. W tym przykładzie zostanie wykorzystany CTransformFilter.

Następnie: Krok 2. Zadeklaruj klasę filtru.

Pisanie filtrów DirectShow