VMR-fönsterlöst läge
[Funktionen som är associerad med den här sidan, DirectShow, är en äldre funktion. Det har ersatts av MediaPlayer, IMFMediaEngineoch Audio / Video Capture i Media Foundation. Dessa funktioner har optimerats för Windows 10 och Windows 11. Microsoft rekommenderar starkt att ny kod använder MediaPlayer, IMFMediaEngine och Audio/Video Capture i Media Foundation i stället för DirectShow, 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.]
Fönsterlöst läge är det bästa sättet för program att återge video i ett programfönster. I fönsterlöst läge läser videomixningsåtergivningen inte in sin Window Manager-komponent och stöder därför inte IBasicVideo eller IVideoWindow-gränssnitt. I stället tillhandahåller programmet uppspelningsfönstret och anger en målrektangel i klientområdet där VMR:n kan rita videon. VMR använder ett DirectDraw Clipper-objekt för att säkerställa att videon klipps till programmets fönster och inte visas i andra fönster. VMR underklassar inte programmets fönster eller installerar system-/processkrokar.
I fönsterlöst läge är sekvensen av händelser under anslutningen och övergången till körningstillståndet följande:
- Det överordnade filtret föreslår en medietyp som VMR antingen accepterar eller avvisar.
- Om medietypen godkänns anropar VMR allokeringspresentatören för att hämta en DirectDraw-yta. Om ytan har skapats ansluter stiften och VMR är redo att övergå till körningstillståndet.
- När filterdiagrammet körs anropar avkodaren GetBuffer- för att hämta ett medieexempel från allokeraren. VMR frågar allokeraren-presentatören för att säkerställa att pixeldjupet, rektangelns storlek och andra parametrar på DirectDraw-ytan är kompatibla med den inkommande videon. Om de är kompatibla returnerar VMR DirectDraw-ytan till avkodaren. När avkodaren har avkodats till ytan validerar VMR:s enhet för kärnsynkronisering tidsstämplarna. Den här lektionen blockerar Ta emot samtal tills presentationstiden kommer. Då anropar VMR PresentImage- på allokerarens presentatör, som visar ytan på grafikkortet.
Följande bild visar VMR i fönsterlöst läge med flera indataströmmar.
Konfigurera VMR-7 för fönsterlöst läge
Om du vill konfigurera VMR-7 för fönsterlöst läge utför du alla följande steg innan du ansluter någon av VMR:s indatastift:
Skapa filtret och lägg till det i diagrammet.
Anropa metoden IVMRFilterConfig::SetRenderingMode med flaggan VMRMode_Windowless.
Du kan också konfigurera VMR för flera indataströmmar genom att anropa IVMRFilterConfig::SetNumberOfStreams. VMR skapar en pin-kod för indata för varje ström. Använd IVMRMixerControl--gränssnittet för att ange Z-ordningen och andra parametrar för strömmen. Mer information finns i VMR med flera strömmar (blandningsläge).
Om du inte anropar SetNumberOfStreamsanvänder VMR-7 som standard en pin-kod för indata. När indatastiften är anslutna kan antalet pins inte ändras.
Anropa IVMRWindowlessControl::SetVideoClippingWindow för att ange det fönster där den renderade videon ska visas.
När de här stegen har slutförts kan du ansluta VMR-filtrets indatastift. Det finns olika sätt att skapa grafen, till exempel att ansluta stift direkt, använda Intelligent Connect-metoder som IGraphBuilder::RenderFileeller använda metoden Capture Graph Builder ICaptureGraphBuilder2::RenderStream. Mer information finns i Allmänna Graph-Building Tekniker.
Om du vill ange videons position i programfönstret anropar du metoden IVMRWindowlessControl::SetVideoPosition. Metoden IVMRWindowlessControl::GetNativeVideoSize returnerar den interna videostorleken. Under uppspelningen bör programmet meddela VMR om följande Windows-meddelanden:
- WM_PAINT: Anropa IVMRWindowlessControl::RepaintVideo för att måla om bilden.
- WM_DISPLAYCHANGE: Anropa IVMRWindowlessControl::D isplayModeChanged. VMR vidtar alla åtgärder som behövs för att visa videon med den nya upplösningen eller färgdjupet.
- WM_SIZE: Beräkna om videons position och anropa SetVideoPosition igen om det behövs.
Not
MFC-program måste definiera en tom WM_ERASEBKGND meddelandehanterare, annars kommer videovisningsområdet inte att målas om korrekt.
Konfigurera VMR-9 för fönsterlöst läge
Om du vill konfigurera VMR-9 för fönsterlöst läge använder du stegen som beskrivs för VMR-7 för fönsterlöst läge, men använder IVMRFilterConfig9 och IVMRWindowlessControl9 gränssnitt. Den enda betydande skillnaden är att VMR-9 skapar fyra indatastift som standard, i stället för en pin-kod för indata. Därför behöver du bara anropa SetNumberOfStreams om du blandar fler än fyra videoströmmar.
Exempelkod
Följande kod visar hur du skapar ett VMR-7-filter, lägger till det i DirectShow-filterdiagrammet och placerar sedan VMR i fönsterlöst läge. För VMR-9 använder du CLSID_VideoMixingRenderer9 i CoCreateInstance- och motsvarande VMR-9-gränssnitt.
HRESULT InitializeWindowlessVMR(
HWND hwndApp, // Application window.
IFilterGraph* pFG, // Pointer to the Filter Graph Manager.
IVMRWindowlessControl** ppWc, // Receives the interface.
DWORD dwNumStreams, // Number of streams to use.
BOOL fBlendAppImage // Are we alpha-blending a bitmap?
)
{
IBaseFilter* pVmr = NULL;
IVMRWindowlessControl* pWc = NULL;
*ppWc = NULL;
// Create the VMR and add it to the filter graph.
HRESULT hr = CoCreateInstance(CLSID_VideoMixingRenderer, NULL,
CLSCTX_INPROC, IID_IBaseFilter, (void**)&pVmr);
if (FAILED(hr))
{
return hr;
}
hr = pFG->AddFilter(pVmr, L"Video Mixing Renderer");
if (FAILED(hr))
{
pVmr->Release();
return hr;
}
// Set the rendering mode and number of streams.
IVMRFilterConfig* pConfig;
hr = pVmr->QueryInterface(IID_IVMRFilterConfig, (void**)&pConfig);
if (SUCCEEDED(hr))
{
pConfig->SetRenderingMode(VMRMode_Windowless);
// Set the VMR-7 to mixing mode if you want more than one video
// stream, or you want to mix a static bitmap over the video.
// (The VMR-9 defaults to mixing mode with four inputs.)
if (dwNumStreams > 1 || fBlendAppImage)
{
pConfig->SetNumberOfStreams(dwNumStreams);
}
pConfig->Release();
hr = pVmr->QueryInterface(IID_IVMRWindowlessControl, (void**)&pWc);
if (SUCCEEDED(hr))
{
pWc->SetVideoClippingWindow(hwndApp);
*ppWc = pWc; // The caller must release this interface.
}
}
pVmr->Release();
// Now the VMR can be connected to other filters.
return hr;
}
Relaterade ämnen