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:
EVR anger medietypen på referensströmmen.
EVR anropar IMFVideoPresenter::P rocessMessage på presentatören med meddelandet MFVP_MESSAGE_INVALIDATEMEDIATYPE.
Presentatören anger medietypen på mixerns utdataström.
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. |
Relaterade ämnen