Använda videovisningskontrollerna

[Komponenten som beskrivs på den här sidan, Enhanced Video Renderer, är en äldre funktion. Det har ersatts av Simple Video Renderer (SVR) som finns tillgänglig via de MediaPlayer- och IMFMediaEngine-komponenterna. 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.]

IMFVideoDisplayControl-gränssnittet styr hur den förbättrade videoåtergivningen (EVR) visar video i ett programfönster. Det här gränssnittet kan användas i DirectShow eller Media Foundation. Internt tillhandahålls videovisningskontrollerna av EVR:s standardpresentatör. Om du skriver en anpassad presentatör kan du ange samma gränssnitt eller definiera ett anpassat gränssnitt.

Det rätta sättet att få en pekare till IMFVideoDisplayControl--gränssnittet beror på om du använder DirectShow-versionen av EVR eller Media Foundation-versionen. För Media Foundation EVR beror det också på om du använder EVR direkt eller använder den via mediasessionen (vilket är mer typiskt).

Gör följande för att få en pekare till IMFVideoDisplayControl-gränssnittet:

  1. Hämta en pekare till IMFGetService--gränssnittet.

    • Om du använder filtret DirectShow EVR anropar du QueryInterface på filtret.

    • Om du använder EVR-mediemottagaren direkt anropar du QueryInterface på mediemottagaren.

    • Om du använder mediasessionen anropar du QueryInterface på mediesessionen.

  2. Om du använder mediesessionen väntar du tills mediasessionen skickar MESessionTopologyStatus händelse med statusvärdet MF_TOPOSTATUS_READY. (Hoppa över det här steget annars.)

  3. Ring IMFGetService::GetService för att hämta IMFVideoDisplayControl-gränssnittet. Tjänstidentifieraren är MR_VIDEO_RENDER_SERVICE.

Du kan använda gränssnittet IMFVideoDisplayControl för att utföra följande uppgifter:

  • Ange urklippsfönstret.

  • Ange käll- och målrektanglarna.

  • Uppdatera videofönstret som svar på fönstermeddelanden.

  • Aktivera eller inaktivera helskärmsläge.

Urklippsfönster

Programmet måste ange ett fönster där EVR ritar videon. Om du vill ange urklippsfönstret anropar du IMFVideoDisplayControl::SetVideoWindow med ett handtag till programfönstret.

Om du skapar EVR-mediesänkan via dess aktiveringsobjekt, behövs inte det här steget. Aktiveringsobjektet anropar automatiskt SetVideoWindow, med hjälp av det fönsterhandtag som du angav i funktionen MFCreateVideoRendererActivate.

Käll- och målrektanglar

Under uppspelningen tar presentatören en del av den sammansatta videobilden och drar den till ett område i videofönstret. Delen av den sammansatta bilden är den källrektangeln, och området i videofönstret är målrektangel.

Källrektangeln definieras med normaliserade koordinater där punkten (0.0, 0.0) motsvarar videons övre vänstra hörn och (1.0, 1.0) motsvarar videons nedre högra hörn. Källrektangeln kan vara vilken region som helst i den här rektangeln. Målrektangeln anges i bildpunkter i förhållande till fönstrets klientområde. Standardrektangeln för källan är hela bilden och standardmålrektangeln är en tom rektangel.

Om du vill ange käll- och målrektanglar anropar du IMFVideoDisplayControl::SetVideoPosition.

Om du skapar EVR-mediemottagaren via dess aktiveringsobjekt krävs inte det här steget. Aktiveringsobjektet anger automatiskt målrektangeln lika med hela klientområdet i fönstret. Du bör dock anropa SetVideoPosition- om du vill ändra källrektangeln eller ange en annan målrektangel.

Fönstermeddelanden

Under uppspelningen bör programmet svara på vissa fönstermeddelanden på följande sätt:

  • WM_PAINT: Ring IMFVideoDisplayControl::RepaintVideo för att uppdatera videon. Undvik också att måla över målområdet medan videon spelas upp, eftersom detta kan orsaka flimmer.

  • WM_SIZE: Du kan behöva anropa SetVideoPosition för att ändra storlek på målrektangeln.

Till skillnad från VMR-filtret (Video Mixing Renderer) i DirectShow behöver du inte meddela EVR när du får ett WM_DISPLAYCHANGE meddelande.

förbättrad videoåtergivning