Supposons que j'ai un jeu OpenGL fonctionnant plein écran (gauche 4 morts 2). J'aimerais obtenir de manière programmable d'obtenir une prise d'écran, puis écrivez-le dans un fichier vidéo. p>
J'ai essayé des méthodes GDI, D3D et OpenGL (par exemple, GlreadPixels) et recevez un écran vierge ou scintiller dans le flux de capture. P>
Des idées? P>
Pour ce que ça vaut la peine, un exemple canonique de quelque chose de similaire à ce que j'essaie d'atteindre est FRAPS. P>
3 Réponses :
J'ai trouvé un projet Sourceforge'd appelé Taksi: P>
http://taksi.sourceforge.net/ p>
TAKSI ne fournit pas de capture audio, cependant. P>
Il y a quelques approches à ce problème. La plupart d'entre eux sont Icky, et cela dépend totalement du type d'API graphique que vous souhaitez cibler et qui fonctionne l'utilisation de l'application cible. La plupart des applications DirectX, GDI + et OpenGL sont doubles ou tamponnaires-tamponnées. Ils appellent tous:
void SwapBuffers(HDC hdc)
Vous pouvez installer un crochet global ou un crochet local de fil-plat dans le processus cible et capturer les messages WM_Paint. Cela vous permet de copier le contenu du contexte des périphériques juste avant que la peinture ne se produise. Le processus peut être trouvé en énumérant tous les processus du système et recherchez un nom de fenêtre connu ou une poignée de module connue. P> li>
Vous pouvez injecter du code dans la copie locale du processus cible des swapbuffers. Sur Linux, cela serait facile à faire via la variable environnementale LD_PRÉLOAD ou en appelant LD-Linux.so.2 explicitement, mais il n'y a pas d'équivalent sur Windows. Heureusement, il existe un cadre de la recherche Microsoft qui peut faire cela pour vous appeler Le groupe Démoscene Farbrausch a fait un outil de capture de démonstration nommé Kkapture qui utilise la bibliothèque de détours. Leur outil cible des applications nécessitant aucune entrée de l'utilisateur, il est donc essentiellement exécuté les démos à un framerate fixe en accrochant dans toutes les fonctions temporelles possibles, comme TimegeTime (), GettickCount () et QueryPerformCounter (). C'est totalement rad. Une présentation écrite par RYG (je pense?) En ce qui concerne les internes de Kkapture's peut être trouvée ici . Je pense que cela vous intéresse. P> Pour plus d'informations sur les hameçons Windows, voir ici et ici . P> Cette idée m'a intrigué, j'ai donc utilisé des détours pour accrocher aux applications OpenGL et en désordre avec les graphiques. Voici la Quake 2 avec le brouillard vert ajouté: détours fonctionne sur deux niveaux. L'accrochage réel ne fonctionne que dans le même espace de processus que le processus cible. Donc, Detours a une fonction pour injecter une DLL dans un processus et forcer sa DLLMain à fonctionner aussi, ainsi que des fonctions censées être utilisées dans cette DLL. Lorsque DLLMAIN est exécuté, la DLL doit appeler DETOURATTACH () pour spécifier les fonctions à accrocher, ainsi que la fonction "Détour", qui correspond au code que vous souhaitez remplacer avec. P> donc cela fonctionne essentiellement comme Ceci: p> Il y a des mises en garde cependant. Lorsque DLLMAIN est exécuté, les bibliothèques importées ultérieurement avec LoadLibrary () ne sont pas encore visibles. Vous ne pouvez donc pas nécessairement tout configurer pendant l'événement d'attachement DLL. Une solution de contournement est de garder une trace de toutes les fonctions qui sont remplacées jusqu'à présent et d'essayer d'initialiser les autres à l'intérieur de ces fonctions que vous pouvez déjà appeler. De cette façon, vous découvrirez de nouvelles fonctions dès que LoadLibrary les a cachés dans l'espace mémoire du processus. Je ne suis pas tout à fait sûr à quel point cela fonctionnerait bien pour WglgeProcaddress. (Peut-être que quelqu'un d'autre ici a des idées à ce sujet?) P> Certains appels LoadLibrary () semblent échouer. J'ai testé avec le Quake 2, et DirectSound et l'API d'onde n'a pas réussi à initaliser pour une raison quelconque. J'échège toujours cela. P> P> EDIT: H1>
p>
quelques informations supplémentaires sur la façon dont Détours fonctionne, car je l'ai utilisé la première main maintenant: h2>
Insta +1 pour mentionner Seul Farbrausch et un autre virtuel pour la bonne réponse
J'ai écrit des graisseurs d'écran dans le passé (DirectX7-9 ère). J'ai trouvé de bons vieux
Avez-vous accès au code source? (c'est-à-dire l4d2 juste un exemple?)