Dela via


Anpassade mixers

[Komponenten som beskrivs på den här sidan, Enhanced Video Renderer, är en äldre funktion. Det har ersatts av Simple Video Renderer (SVR) exponeras via MediaPlayer och IMFMediaEngine komponenter. Om du vill spela upp videoinnehåll bör du skicka data till någon av dessa komponenter och låta dem instansiera den nya videoåtergivningen. Dessa komponenter har optimerats för Windows 10 och Windows 11. Microsoft rekommenderar starkt att ny kod använder MediaPlayer eller den lägre nivån IMFMediaEngine API:er för att spela upp videomedier i Windows i stället för EVR när det är möjligt. Microsoft föreslår att befintlig kod som använder äldre API:er skrivs om för att använda de nya API:erna om möjligt.]

Det här avsnittet beskriver hur du skriver en anpassad mixer för den förbättrade videoåtergivningen (EVR). Du kan använda en anpassad mixer med media foundation EVR-mediemottagaren eller DirectShow EVR-filtret. Mer information om blandare och presentatörer finns i Enhanced Video Renderer.

Mixern är en Media Foundation-transformering (MFT) med en eller flera indata (referensströmmen plus underströmmen) och en utdata. Indataströmmen tar emot exempel från uppströms. Utdataströmmen levererar exempel till presentatören. EVR ansvarar för att anropa IMFTransform::P rocessInput på mixern, och presentatören ansvarar för att anropa IMFTransform::P rocessOutput.

En EVR-mixer måste minst implementera följande gränssnitt:

Gränssnitt Beskrivning
IMFTransform Tillhandahåller grundläggande MFT-funktioner.
IMFTopologyServiceLookupClient Gör att mixern kan hämta gränssnitt från EVR.
IMFVideoDeviceID Gör att mixern kan hämta gränssnitt från EVR.
IMFAttributes Används för att exponera attributet MF_SA_D3D_AWARE för EVR.

 

Alternativt kan en MFT implementera något av följande gränssnitt:

Gränssnitt Beskrivning
IEVRTrustedVideoPlugin Krävs för att spela upp skyddat innehåll.
IMFGetService Exponerar gränssnitt som IMFVideoMixerBitmap och IMFVideoProcessor för programmet.
IMFQualityAdvise Gör det möjligt för kvalitetshanteraren att justera videokvaliteten.
IMFVideoMixerBitmap Gör att programmet kan blanda en statisk bitmapp i videon.
IMFVideoPositionMapper Mappar koordinaterna för videoramen för utdata till koordinaterna för indatavideoramen.
IMFVideoProcessor Exponerar vissa DXVA-videobearbetningsfunktioner för programmet.

 

Formatera förhandling med mixern fungerar på följande sätt:

  1. EVR anger medietypen på referensströmmen.

  2. EVR anropar IMFVideoPresenter::P rocessMessage på presentatören med meddelandet MFVP_MESSAGE_INVALIDATEMEDIATYPE.

  3. Presentatören anger medietypen på mixerns utdataström.

  4. EVR anger medietypen på underströmmen.

Om medietypen på referensströmmen ändras är mixerns andra medietyper inte längre giltiga. Mixerns IMFTransform::P rocessOutput-metoden misslyckas sedan och returnerar MF_E_TRANSFORM_STREAM_CHANGE. Presentatören bör inte göra något just nu. EVR initierar formatförhandlingsprocessen igen.

När någon indataström når slutet av strömmen anropar EVR IMFTransform::P rocessMessage på mixern med MFT_MESSAGE_NOTIFY_END_OF_STREAM.

Mixern skickar följande händelser till EVR med hjälp av EVR:s IMediaEventSink- gränssnitt. Det här gränssnittet finns dokumenterat i DirectShow SDK-dokumentationen.

Händelse Beskrivning
EC_SAMPLE_NEEDED Mixern kräver ett nytt indataexempel.

 

EVR kan anropa ProcessOutput- på mixern innan direktuppspelningen startar. Mixern bör inte misslyckas med dessa anrop. I stället bör den fylla utdataytan med svarta bildpunkter. Mixern bör fortsätta att färgfylla utdataexempel tills den tar emot ett MFT_MESSAGE_NOTIFY_BEGIN_STREAMING meddelande eller ProcessInput-metoden anropas. Om mixern får ett MFT_MESSAGE_NOTIFY_END_STREAMING meddelande bör den växla tillbaka till färgfyllningsläget.

Implementera IMFVideoDeviceID

Gränssnittet IMFVideoDeviceID innehåller en metod, GetDeviceID, som returnerar ett enhets-GUID. Enhetens GUID säkerställer att presentatören och mixern använder kompatibla tekniker. Om enhetens GUID inte matchar kan EVR inte initieras.

Standardblandaren och presentatören använder båda Direct3D 9, med enhetens GUID lika med IID_IDirect3DDevice9. Om du tänker använda din anpassade presentatör med standardblandaren måste presentatörens enhets-GUID vara IID_IDirect3DDevice9. Om du ersätter båda komponenterna kan du definiera ett nytt enhets-GUID.

Implementera IMFTopologyServiceLookupClient

Mixern måste implementera IMFTopologyServiceLookupClient-gränssnittet. Innan strömningen börjar anropar EVR IMFTopologyServiceLookupClient::InitServicePointers och skickar en pekare till EVR:s IMFTopologyServiceLookup-gränssnittet. Mixern använder den här pekaren för att hämta gränssnittspekare från EVR.

Mixern måste minst fråga efter följande gränssnitt:

När EVR anropar IMFTopologyServiceLookupClient::ReleaseServicePointersmåste mixern släppa alla pekare som hämtats från anropet till InitServicePointers.

Mixerattribut

En mixer bör ha stöd för följande attribut.

Attribut Beskrivning
MF_SA_D3D_AWARE Anger om mixern stöder DirectX Video Acceleration (DXVA).
MF_SA_REQUIRED_SAMPLE_COUNT Antalet videoexempel som EVR ska allokera för varje mixerström. Det här attributet gäller för enskilda strömmar. använd attributarkivet som returneras av IMFTransform::GetInputStreamAttributes.

 

Ställa in mixern på EVR

Om du vill ange en anpassad mixer på EVR anropar du IMFVideoRenderer::InitializeRenderer. Både DirectShow EVR-filtret och EVR-mediemottagaren implementerar den här metoden.

EVR-aktiveringsobjekt. Om du använder EVR-aktiveringsobjektet kan du ange en anpassad mixer genom att ange något av följande attribut för EVR-aktiveringsobjektet:

Attribut Beskrivning
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_ACTIVATE Pekare till ett aktiveringsobjekt för mixern. Aktiveringsobjektet måste implementera gränssnittet IMFActivate.
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_CLSID CLSID på mixern.

 

förbättrad videoåtergivning