plus pantalla pagina moto hacer fireshot descargar completa como chrome capturar captura c++ winapi directx ms-media-foundation

c++ - pantalla - screenshot en chrome



Captura de pantalla completa y renderizado en DirectX (2)

Si no te gusta el FrontBuffer, prueba el BackBuffer:

LPDIRECT3DSURFACE9 surface; surface = GetBackBufferImageSurface(&fmt);

para guardarlo en un archivo de uso

D3DXSaveSurfaceToFile(filename, D3DXIFF_JPG, surface, NULL, NULL);

Necesito alguna forma de obtener datos de pantalla y pasarlos a la superficie / textura DX9 en mi aplicación y renderizarlos a por lo menos 25 fps con una resolución de 1600 * 900 , 30 serían mejores.

Probé BitBliting pero incluso después de eso estoy a 20 fps y después de cargar datos en la textura y renderizarlo estoy a 11 fps, que está muy por detrás de lo que necesito.

GetFrontBufferData está fuera de lugar.

Aquí hay algo sobre el uso de Windows Media API , pero no estoy familiarizado con él. Sample está guardando los datos directamente en el archivo, tal vez se puede configurar para darle marcos individuales, pero no he encontrado suficiente documentación para probarlo solo.

Mi código:

m_memDC.BitBlt(0, 0, m_Rect.Width(),m_Rect.Height(), //m_Rect is area to be captured &m_dc, m_Rect.left, m_Rect.top, SRCCOPY); //at 20-25fps after this if I comment out the rest //DC,HBITMAP setup and memory alloc is done once at the begining GetDIBits( m_hDc, (HBITMAP)m_hBmp.GetSafeHandle(), 0L, // Start scan line (DWORD)m_Rect.Height(), // # of scan lines m_lpData, // LPBYTE (LPBITMAPINFO)m_bi, // address of bitmapinfo (DWORD)DIB_RGB_COLORS); // Use RGB for color table //at 17-20fps IDirect3DSurface9 *tmp; m_pImageBuffer[0]->GetSurfaceLevel(0,&tmp); //m_pImageBuffer is Texture of same //size as bitmap to prevent stretching hr= D3DXLoadSurfaceFromMemory(tmp,NULL,NULL, (LPVOID)m_lpData, D3DFMT_X8R8G8B8, m_Rect.Width()*4, NULL, &r, //SetRect(&r,0,0,m_Rect.Width(),m_Rect.Height(); D3DX_DEFAULT,0); //12-14fps IDirect3DSurface9 *frameS; hr=m_pFrameTexture->GetSurfaceLevel(0,&frameS); // Texture of that is rendered pd3dDevice->StretchRect(tmp,NULL,frameS,NULL,D3DTEXF_NONE); //11fps

Descubrí que para 512 * 512 cuadrados funcionaba a 30 fps (por ejemplo, 490 * 450 a 20-25), así que traté de dividir la pantalla, pero no parecía funcionar bien.

Si falta algo en el código, escriba, no vote. Gracias


A partir de Windows 8, hay una nueva API de duplicación de escritorio que se puede utilizar para capturar la pantalla en la memoria de video, incluidos los cambios del cursor del mouse y qué partes de la pantalla realmente se cambiaron o movieron. Esto es mucho más eficaz que cualquiera de los enfoques GDI o D3D9 y es muy adecuado para hacer cosas como codificar el escritorio en un flujo de video, ya que nunca tiene que sacar la textura de la memoria de la GPU. La nueva API está disponible enumerando las salidas DXGI y llamando a DuplicateOutput en la pantalla que desea capturar. Luego puede ingresar un bucle que espera que la pantalla se actualice y adquiera cada fotograma por turno.

Para codificar los fotogramas de un video, recomiendo echar un vistazo a Media Foundation . Eche un vistazo específicamente al Sink Writer por el método más simple de codificación de los marcos de video. Básicamente, solo tiene que envolver las texturas D3D que obtiene para cada cuadro de video en objetos IMFSample. Estos pueden pasarse directamente al escritor del receptor. Consulte las funciones MFCreateDXGISurfaceBuffer y MFCreateVideoSampleFromSurface para obtener más información. Para obtener el mejor rendimiento, normalmente querrá usar un códec como H.264 que tenga un buen soporte de codificación de hardware (en la mayoría de las máquinas).

Para una divulgación completa, trabajo en el equipo que posee la API de duplicación de escritorio en Microsoft, y personalmente he escrito aplicaciones que capturan el escritorio (y video, juegos, etc.) en un archivo de video a 60 fps utilizando esta técnica, así como como muchos otros escenarios. Esto también se usa para hacer streaming de pantalla, asistencia remota y mucho más dentro de Microsoft.