Dela via


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.

vmr i fönsterlöst läge

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:

  1. Skapa filtret och lägg till det i diagrammet.

  2. Anropa metoden IVMRFilterConfig::SetRenderingMode med flaggan VMRMode_Windowless.

  3. 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.

  4. 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:

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;
}

Använda fönsterlöst läge