Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
[De functie die is gekoppeld aan deze pagina, DirectShow, is een verouderde functie. Het is vervangen door MediaPlayer, IMFMediaEngineen Audio/Video Capture in Media Foundation. Deze functies zijn geoptimaliseerd voor Windows 10 en Windows 11. Microsoft raadt ten zeerste aan om nieuwe code te gebruiken MediaPlayer, IMFMediaEngine en Audio/Video Capture in Media Foundation in plaats van DirectShow, indien mogelijk. Microsoft stelt voor dat bestaande code die gebruikmaakt van de verouderde API's, indien mogelijk opnieuw worden geschreven om de nieuwe API's te gebruiken.]
De modus Zonder venster is de voorkeur voor toepassingen om video weer te geven in een toepassingsvenster. In de modus Zonder venster wordt het onderdeel Window Manager niet geladen in de videomixer en wordt daarom geen ondersteuning geboden voor de IBasicVideo of IVideoWindow interfaces. In plaats daarvan biedt de toepassing het afspeelvenster en stelt u een doelrechthoek in het clientgebied in voor de VMR om de video te tekenen. De VMR maakt gebruik van een DirectDraw-clipper-object om ervoor te zorgen dat de video wordt geknipt in het venster van de toepassing en niet wordt weergegeven in andere vensters. De VMR subklassen van het venster van de toepassing of installeert geen systeem-/proceshook.
In de modus zonder venster is de volgorde van gebeurtenissen tijdens de verbinding en overgang naar de uitvoeringsstatus als volgt:
- Het upstream-filter stelt een mediatype voor, dat door de VMR wordt geaccepteerd of geweigerd.
- Als het mediatype wordt geaccepteerd, roept de VMR de allocator-presentator aan om een DirectDraw-oppervlak te verkrijgen. Als het oppervlak is gemaakt, maken de pinnen verbinding en is de VMR klaar om over te stappen naar de uitvoeringsstatus.
- Wanneer de filtergrafiek wordt uitgevoerd, roept de decoder GetBuffer- aan om een mediavoorbeeld van de allocator op te halen. De VMR voert een query uit op de allocator-presentator om ervoor te zorgen dat de pixeldiepte, rechthoekgrootte en andere parameters op het DirectDraw-oppervlak compatibel zijn met de binnenkomende video. Als ze compatibel zijn, retourneert de VMR het DirectDraw-oppervlak naar de decoder. Nadat de decoder in het oppervlak is gedecodeerd, valideert de kernsynchronisatie-eenheid van de VMR de tijdstempels. In deze les wordt de oproep Ontvangen geblokkeerd totdat de presentatietijd binnenkomt. Op dat moment roept de VMR PresentImage- aan op de allocator-presentator, die het oppervlak aan de grafische kaart presenteert.
In de volgende afbeelding ziet u de VMR in de modus zonder venster met meerdere invoerstromen.
de VMR-7 configureren voor de modus zonder venster
Als u de VMR-7 wilt configureren voor de modus zonder venster, moet u alle volgende stappen uitvoeren voordat u een van de invoerpinnen van de VMR verbindt:
Maak het filter en voeg het toe aan de grafiek.
Roep de methode IVMRFilterConfig::SetRenderingMode aan met de vlag VMRMode_Windowless.
Configureer desgewenst de VMR voor meerdere invoerstromen door IVMRFilterConfig::SetNumberOfStreamsaan te roepen. De VMR maakt een invoerpincode voor elke stream. Gebruik de interface IVMRMixerControl om de Z-volgorde en andere parameters voor de stream in te stellen. Zie VMR met meerdere stromen (mengmodus)voor meer informatie.
Als u SetNumberOfStreams-niet aanroept, wordt de VMR-7 standaard ingesteld op één invoerpin. Nadat de invoerpinnen zijn verbonden, kan het aantal pinnen niet meer worden gewijzigd.
Oproep IVMRWindowlessControl::SetVideoClippingWindow om het venster op te geven waarin de weergegeven video wordt weergegeven.
Zodra deze stappen zijn voltooid, kunt u de invoerpinnen van het VMR-filter verbinden. Er zijn verschillende manieren om de grafiek te bouwen, zoals het rechtstreeks verbinden van pinnen, met behulp van Intelligent Connect-methoden zoals IGraphBuilder::RenderFile, of met behulp van de methode Capture Graph Builder's ICaptureGraphBuilder2::RenderStream methode. Zie General Graph-Building Techniquesvoor meer informatie.
Als u de positie van de video in het toepassingsvenster wilt instellen, roept u de methode IVMRWindowlessControl::SetVideoPosition aan. De methode IVMRWindowlessControl::GetNativeVideoSize retourneert de systeemeigen videogrootte. Tijdens het afspelen moet de toepassing de VMR op de hoogte stellen van de volgende Windows-berichten:
- WM_PAINT: roep IVMRWindowlessControl::RepaintVideo aan om de afbeelding opnieuw te plaatsen.
- WM_DISPLAYCHANGE: Roep IVMRWindowlessControl::D isplayModeChangedaan. De VMR voert alle acties uit die nodig zijn om de video op de nieuwe resolutie of kleurdiepte weer te geven.
- WM_SIZE: bereken zo nodig opnieuw de positie van de video en bel SetVideoPosition opnieuw.
Notitie
MFC-toepassingen moeten een lege WM_ERASEBKGND berichthandler definiëren of het videoweergavegebied wordt niet correct opnieuw geschilderd.
de VMR-9 configureren voor de modus Zonder venster
Als u de VMR-9 wilt configureren voor de modus zonder venster, gebruikt u de stappen die worden beschreven voor de VMR-7 voor de modus Vensterloos, maar gebruikt u de IVMRFilterConfig9 en IVMRWindowlessControl9 interfaces. Het enige belangrijke verschil is dat de VMR-9 standaard vier invoerpinnen maakt in plaats van één invoerpincode. Daarom hoeft u alleen SetNumberOfStreams aan te roepen als u meer dan vier videostreams mengt.
voorbeeldcode
De volgende code laat zien hoe u een VMR-7-filter maakt, dit toevoegt aan de DirectShow-filtergrafiek en vervolgens de VMR in de modus zonder venster plaatst. Gebruik voor de VMR-9 CLSID_VideoMixingRenderer9 in CoCreateInstance- en de bijbehorende VMR-9-interfaces.
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;
}
Verwante onderwerpen