Miksery niestandardowe
[Składnik opisany na tej stronie, ulepszony program renderowania wideo, jest starszą funkcją. Został zastąpiony przez Simple Video Renderer (SVR) uwidoczniony za pośrednictwem MediaPlayer i IMFMediaEngine składników. Aby odtworzyć zawartość wideo, należy wysłać dane do jednego z tych składników i umożliwić im utworzenie wystąpienia nowego modułu renderowania wideo. Te składniki zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer lub niższego poziomu interfejsów API IMFMediaEngine do odtwarzania multimediów wideo w systemie Windows zamiast EVR, 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.]
W tym temacie opisano sposób pisania niestandardowego miksera dla ulepszonego modułu renderowania wideo (EVR). Możesz użyć niestandardowego miksera z ujściem nośnika Media Foundation EVR lub filtrem DirectShow EVR. Aby uzyskać więcej informacji na temat mikserów i prezenterów, zobacz Enhanced Video Renderer.
Mikser jest transformacją Media Foundation (MFT) z co najmniej jednym wejściem (strumieniem odniesienia oraz podstreamami) i jednym wyjściem. Strumień wejściowy odbiera próbki z nadrzędnego strumienia. Strumień wyjściowy dostarcza próbki do prezentera. EVR jest odpowiedzialny za wywoływanie IMFTransform::P rocessInput na mikserze, a prezenter jest odpowiedzialny za wywołanie IMFTransform::P rocessOutput.
Co najmniej mikser EVR musi zaimplementować następujące interfejsy:
Interfejs | Opis |
---|---|
IMFTransform | Zapewnia podstawowe funkcje MFT. |
IMFTopologyServiceLookupClient | Umożliwia mikserowi uzyskanie interfejsów z urządzenia EVR. |
IMFVideoDeviceID | Umożliwia mikserowi uzyskanie interfejsów z urządzenia EVR. |
IMFAttributes | Służy do uwidaczniania atrybutu MF_SA_D3D_AWARE do EVR. |
Opcjonalnie MFT może zaimplementować dowolny z następujących interfejsów:
Interfejs | Opis |
---|---|
IEVRTrustedVideoPlugin | Wymagane do odtwarzania chronionej zawartości. |
IMFGetService | Uwidacznia interfejsy, takie jak IMFVideoMixerBitmap i IMFVideoProcessor aplikacji. |
IMFQualityAdvise | Umożliwia menedżerowi jakości dostosowanie jakości wideo. |
IMFVideoMixerBitmap | Umożliwia aplikacji mieszanie statycznej mapy bitowej na wideo. |
IMFVideoPositionMapper | Mapuje współrzędne na wyjściowej klatce wideo w celu współrzędnych na wejściowej ramce wideo. |
IMFVideoProcessor | Uwidacznia niektóre funkcje przetwarzania wideo DXVA w aplikacji. |
Format negocjacji z mikser działa w następujący sposób:
EVR ustawia typ nośnika w strumieniu referencyjnym.
EVR wywołuje IMFVideoPresenter::P rocessMessage na prezenterze z komunikatem MFVP_MESSAGE_INVALIDATEMEDIATYPE.
Prezenter ustawia typ nośnika na strumieniu wyjściowym miksera.
EVR ustawia typ nośnika w podstreamach.
Jeśli typ nośnika na strumieniu odniesienia zmieni się, inne typy nośnika mieszarki nie są już prawidłowe. Metoda IMFTransform::P rocessOutput następnie zakończy się niepowodzeniem i zwróci MF_E_TRANSFORM_STREAM_CHANGE. Prezenter nie powinien nic robić w tym momencie. EVR ponownie zainicjuje proces negocjacji formatu.
Gdy dowolny strumień wejściowy osiągnie koniec strumienia, EVR wywołuje IMFTransform::P rocessMessage miksera z MFT_MESSAGE_NOTIFY_END_OF_STREAM.
Mikser wysyła następujące zdarzenia do EVR przy użyciu interfejsuIMediaEventSink EVR. Ten interfejs jest udokumentowany w dokumentacji zestawu SDK DirectShow.
Zdarzenie | Opis |
---|---|
EC_SAMPLE_NEEDED | Mikser wymaga nowej próbki wejściowej. |
Przed rozpoczęciem przesyłania strumieniowego EVR może wywołać ProcessOutput na mikserze. Mikser nie powinien zawiodć tych wywołań. Zamiast tego powinna wypełnić powierzchnię wyjściową czarnymi pikselami. Mikser powinien nadal wypełniać kolorami próbki wyjściowe, dopóki nie otrzyma komunikatu MFT_MESSAGE_NOTIFY_BEGIN_STREAMING lub metody ProcessInput jest wywoływana. Jeśli mikser otrzyma komunikat MFT_MESSAGE_NOTIFY_END_STREAMING, powinien wrócić do trybu wypełnienia kolorami.
Implementowanie identyfikatora IMFVideoDeviceID
Interfejs IMFVideoDeviceID zawiera jedną metodę GetDeviceID, która zwraca identyfikator GUID urządzenia. Identyfikator GUID urządzenia zapewnia, że prezenter i mikser korzystają z zgodnych technologii. Jeśli identyfikatory GUID urządzenia nie są zgodne, nie można zainicjować interfejsu EVR.
Standardowy mikser i prezenter używają direct3D 9, z identyfikatorem GUID urządzenia równym IID_IDirect3DDevice9. Jeśli zamierzasz używać niestandardowego prezentera ze standardowym mikserem, identyfikator GUID urządzenia prezentera musi być IID_IDirect3DDevice9. Jeśli zastąpisz oba składniki, możesz zdefiniować nowy identyfikator GUID urządzenia.
Implementowanie elementu IMFTopologyServiceLookupClient
Mikser musi zaimplementować interfejs IMFTopologyServiceLookupClient. Przed rozpoczęciem przesyłania strumieniowego urządzenie EVR wywołuje IMFTopologyServiceLookupClient::InitServicePointers i przekazuje wskaźnik do interfejsu IMFTopologyServiceLookup EVR. Mikser używa tego wskaźnika, aby uzyskać wskaźniki interfejsu z EVR.
Co najmniej mikser musi wykonywać zapytania dotyczące następującego interfejsu:
Gdy EVR wywołuje IMFTopologyServiceLookupClient::ReleaseServicePointers, mikser musi zwolnić wszelkie wskaźniki uzyskane z wywołania do InitServicePointers.
Atrybuty miksera
Mikser powinien obsługiwać następujące atrybuty.
Atrybut | Opis |
---|---|
MF_SA_D3D_AWARE | Określa, czy mikser obsługuje przyspieszanie wideo DirectX (DXVA). |
MF_SA_REQUIRED_SAMPLE_COUNT | Liczba próbek wideo, które należy przydzielić dla każdego strumienia miksera. Ten atrybut ma zastosowanie do poszczególnych strumieni; użyj magazynu atrybutów zwróconego przez IMFTransform::GetInputStreamAttributes. |
Ustawianie miksera na urządzeniu EVR
Aby ustawić niestandardowy mikser na EVR, wywołaj IMFVideoRenderer::InitializeRenderer. Zarówno filtr DirectShow EVR, jak i ujście multimediów EVR implementują tę metodę.
obiekt aktywacji EVR. Jeśli używasz obiektu aktywacji EVR, możesz podać niestandardowy mikser, ustawiając jeden z następujących atrybutów obiektu aktywacji EVR:
Atrybut | Opis |
---|---|
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_ACTIVATE | Wskaźnik do obiektu aktywacji miksera. Obiekt aktywacji musi zaimplementować interfejs IMFActivate. |
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_CLSID | CLSID miksera. |
Tematy pokrewne
-
ulepszony renderowania wideo