Render AVI to Texture
-
Hi,
ich versuche ein Video auf eine LPDIRECT3DTEXTURE9 zu rendern:
m_pGraph->QueryInterface(IID_IVideoWindow, (void**)&m_pVideoWin); ... m_pVideoWin->put_AutoShow(OAFALSE); m_pVideoWin->put_Owner(reinterpret_cast<OAHWND>(m_WndVideo)); m_pVideoWin->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS); CalculateVideoSize(); m_pVideoWin->put_AutoShow(OATRUE); m_pVideoWin->put_Visible(OATRUE); m_pVideoWin->SetWindowForeground(OATRUE);Ich versuche das Video auf ein HWND (m_pVideoWin) zu rendern.
Ach ja, zur Info: den gleichen Code habe ich unter der WinAPI Version des Programms schon erfolgreich benutzt.Für die Ausgabe auf den Monitor verwende ich diesen Code (der ist neu und ich hab keine Ahnung ob das alles richtig ist
- auf dem Gebiet DirectX bin ich recht neu...)// Get HDC WinAPI HDC hdc = ::GetDC(m_WndVideo); HDC hdcMem = ::CreateCompatibleDC(hdc); RECT r; ::GetClientRect(m_WndVideo, &r); HBITMAP hbm = ::CreateBitmap(r.right, r.bottom, 1, 32, NULL); HGDIOBJ hbmOld = ::SelectObject(hdcMem, hbm); ::SendMessage(m_WndVideo, WM_PRINT, (WPARAM)hdcMem, PRF_CHILDREN | PRF_CLIENT); // Copy to DirectX Texture LPDIRECT3DSURFACE9 pSurfaceDst; HDC hdcDest; m_pVideoTexture->GetSurfaceLevel(0,&pSurfaceDst); HRESULT hr = pSurfaceDst->GetDC(&hdcDest); ::BitBlt(hdcDest, 0, 0, r.right, r.bottom, hdcMem, 0, 0, SRCCOPY); pSurfaceDst->ReleaseDC(hdcDest); pSurfaceDst->Release(); // Cleanup Browser WinAPI ::SelectObject(hdcMem, hbmOld); ::DeleteObject(hbm); ::DeleteDC(hdcMem); ::ReleaseDC(m_WndVideo, hdc); // Bring it now to the screen LPD3DXSPRITE spriteInterface = k3Engine::Core::CGame::GetSpriteInterface(); D3DXMATRIX matScale; float xScale = (float) 500 / (float) WINDOW_WIDTH; float yScale = (float) 500 / (float) WINDOW_HEIGHT; float posX, posY; posX = 0 * 1 / xScale; posY = MENU_HEIGHT + 40 * 1 / yScale; D3DXVECTOR3 position(posX, posY, 0.0f); D3DXMatrixScaling(&matScale, xScale, yScale, 1.0f); spriteInterface->SetTransform(&matScale); spriteInterface->Draw(m_pVideoTexture, NULL, NULL, &position, D3DCOLOR_XRGB(255, 255, 255)); // draw it!Ich denke es liegt daran, das das Video direkt auf die Grafikkarte gerendert wird und nicht auf das HWND.
Ich hab so das Gefühl, das ich auf dem falschen Weg bin... kann mir jemand einen Tipp geben?
-
Ich hab mir deinen Code nicht weiter angeschaut, der ist mir zu verworren.
Aber ich machte sehr gute Erfahrungen mit den AVIFile??? und AVIStream??? aus dee WinAPI. Die sind auf allen relevanten Windowsversionen verfügbar und damit kann man sich jedes gewünschte Frame (Bild wie Ton) in den Speicher entpacken lassen. Also insbesondere auch in den gelockten Speicher der Surface.
-
Danke, ich werd es damit probieren
-
Sorry, das ich den alten Beitrag raus krame
Ich hab mir AVIFile mal angeschaut - müsste aber dann doch IVideoWindow benutzen.
Habe folgenden Beitrag gefunden:
http://msdn.microsoft.com/en-us/library/ms867211.aspxAllerdings komme ich damit nicht zurecht...
z.B. m_lpIVMRSurfAllocNotify hat bei mir keine Methode SetD3DDeviceHat jemand noch einen anderen Tipp für mich?