Tryb bez okna maszyny wirtualnej
[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w programie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]
Tryb bez okna jest preferowanym sposobem renderowania wideo przez aplikacje w oknie aplikacji. W trybie bez okien moduł renderowania mieszania wideo nie ładuje składnika Menedżer okien i dlatego nie obsługuje interfejsów IBasicVideo ani interfejsów IVideoWindow. Zamiast tego aplikacja udostępnia okno odtwarzania i ustawia prostokąt docelowy w obszarze klienta maszyny wirtualnej w celu narysowania wideo. Maszyna wirtualna używa obiektu clipper DirectDraw, aby upewnić się, że klip wideo jest przycięty do okna aplikacji i nie jest wyświetlany w żadnym innym oknie. Maszyna wirtualna nie klasyfikuje okna aplikacji ani nie instaluje żadnych punktów zaczepienia systemu/procesu.
W trybie bez okien sekwencja zdarzeń podczas połączenia i przejścia do stanu uruchomienia jest następująca:
- Filtr nadrzędny proponuje typ nośnika, który maszyna wirtualna VMR akceptuje lub odrzuca.
- Jeśli typ nośnika jest akceptowany, usługa VMR wywołuje obiekt prezenter alokatora w celu uzyskania powierzchni DirectDraw. Jeśli powierzchnia zostanie utworzona pomyślnie, wyprowadzenia nawiążą połączenie, a maszyna wirtualna jest gotowa do przejścia do stanu uruchomienia.
- Po uruchomieniu wykresu filtru dekoder wywołuje GetBuffer, aby pobrać próbkę multimediów z alokatora. Usługa VMR wysyła zapytanie do prezentera alokatora, aby upewnić się, że głębokość pikseli, rozmiar prostokąta i inne parametry na powierzchni DirectDraw są zgodne z przychodzącym wideo. Jeśli są one zgodne, maszyna wirtualna vmR zwraca powierzchnię DirectDraw do dekodera. Po dekodowanie dekodera na powierzchnię jednostka synchronizacji podstawowej maszyny wirtualnej weryfikuje sygnatury czasowe. Ta lekcja blokuje wywołanie odbierania do momentu odebrania prezentacji. W tym momencie maszyna wirtualna wywołuje PresentImage na prezenterze alokatora, który przedstawia powierzchnię na karcie grafiki.
Poniższa ilustracja przedstawia maszynę wirtualną VMR w trybie bez okien z wieloma strumieniami wejściowymi.
konfigurowanie vmR-7 dla trybu bez okien
Aby skonfigurować maszynę wirtualną VMR-7 dla trybu bez okien, przed połączeniem dowolnego numeru PIN wejściowego maszyny wirtualnej wykonaj wszystkie poniższe kroki:
Utwórz filtr i dodaj go do grafu.
Wywołaj metodę IVMRFilterConfig::SetRenderingMode z flagą VMRMode_Windowless.
Opcjonalnie skonfiguruj maszynę wirtualną VMR dla wielu strumieni wejściowych, wywołując IVMRFilterConfig::SetNumberOfStreams. Maszyna wirtualna tworzy numer PIN wejściowy dla każdego strumienia. Użyj interfejsu IVMRMixerControl, aby ustawić kolejność Z i inne parametry dla strumienia. Aby uzyskać więcej informacji, zobacz VMR with Multiple Streams (Mieszanie trybu).
Jeśli nie wywołasz SetNumberOfStreams, wartość domyślna vmR-7 to jeden numer PIN wejściowy. Po nawiązaniu połączenia wyprowadzeń wejściowych nie można zmienić liczby wyprowadzeń.
Wywołaj IVMRWindowlessControl::SetVideoClippingWindow, aby określić okno, w którym będzie wyświetlane renderowane wideo.
Po wykonaniu tych kroków można połączyć wyprowadzenia wejściowe filtru maszyny wirtualnej. Istnieją różne sposoby tworzenia grafu, takie jak bezpośrednie łączenie pinów przy użyciu metod Intelligent Connect, takich jak IGraphBuilder::RenderFilelub przy użyciu metody ICaptureGraphBuilder2::RenderStreamnarzędzia Capture GraphBuilder. Aby uzyskać więcej informacji, zobacz Ogólne techniki Graph-Building.
Aby ustawić położenie filmu wideo w oknie aplikacji, wywołaj metodę IVMRWindowlessControl::SetVideoPosition. Metoda IVMRWindowlessControl::GetNativeVideoSize zwraca natywny rozmiar wideo. Podczas odtwarzania aplikacja powinna powiadamiać maszynę wirtualną o następujących komunikatach systemu Windows:
- WM_PAINT: Wywołaj IVMRWindowlessControl::RepaintVideo, aby przemalować obraz.
- WM_DISPLAYCHANGE: Wywołaj IVMRWindowlessControl::D isplayModeChanged. Maszyna wirtualna wykonuje wszelkie akcje potrzebne do wyświetlenia filmu wideo w nowej rozdzielczości lub głębokości koloru.
- WM_SIZE: Oblicz ponownie położenie filmu wideo i wywołaj SetVideoPosition ponownie, jeśli to konieczne.
Nuta
Aplikacje MFC muszą definiować pustą WM_ERASEBKGND obsługi komunikatów lub obszar wyświetlania wideo nie będzie poprawnie przemalowywać.
Konfigurowanie maszyny wirtualnej VMR-9 dla trybu bez okien
Aby skonfigurować maszynę wirtualną VMR-9 dla trybu bez okien, wykonaj kroki opisane dla trybu bez okien VMR-7, ale użyj IVMRFilterConfig9 i IVMRWindowlessControl9 interfejsów. Jedyną znaczącą różnicą jest to, że maszyna WIRTUALNA-9 domyślnie tworzy cztery wyprowadzenia wejściowe, a nie jedno wyprowadzenia wejściowe. W związku z tym wystarczy wywołać SetNumberOfStreams, jeśli mieszasz więcej niż cztery strumienie wideo.
przykładowy kod
Poniższy kod pokazuje, jak utworzyć filtr VMR-7, dodać go do wykresu filtru DirectShow, a następnie umieścić maszynę wirtualną w trybie bez okien. W przypadku maszyny wirtualnej VMR-9 użyj CLSID_VideoMixingRenderer9 w CoCreateInstance i odpowiednich interfejsach VMR-9.
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;
}
Tematy pokrewne