Je veux écrire un programme de screencasting pour la plateforme Windows, mais je ne sais pas comment capturer l'écran. La seule méthode dont j'ai connaissance est l'utilisation de GDI, mais je suis curieux de savoir s'il existe d'autres façons de procéder et, le cas échéant, laquelle entraîne le moins de frais généraux ? La vitesse est une priorité.
Le programme de screencasting servira à enregistrer les séquences de jeu, mais si cela réduit les options, je suis toujours ouvert à toute autre suggestion qui n'entre pas dans ce cadre. Le savoir n'est pas mauvais, après tout.
Modifier : Je suis tombé sur cet article : Différentes méthodes pour capturer l'écran . Il m'a fait découvrir la façon de procéder de l'API Windows Media et la façon de procéder de DirectX. Dans la conclusion, il est mentionné que la désactivation de l'accélération matérielle peut améliorer considérablement les performances de l'application de capture. Je suis curieux de savoir pourquoi. Quelqu'un pourrait-il remplir les blancs manquants pour moi ?
Modifier : J'ai lu que les programmes de screencasting tels que Camtasia utilisent leur propre pilote de capture. Quelqu'un pourrait-il m'expliquer en détail comment cela fonctionne, et pourquoi c'est plus rapide ? Je pourrais également avoir besoin de conseils sur la mise en œuvre de quelque chose comme ça, mais je suis sûr qu'il existe une documentation existante de toute façon.
Aussi, je sais maintenant comment FRAPS enregistre l'écran. Il utilise l'API graphique sous-jacente pour lire à partir du tampon arrière. D'après ce que j'ai compris, c'est plus rapide que de lire à partir du tampon avant, car vous lisez à partir de la RAM du système, plutôt que de la RAM vidéo. Vous pouvez lire l'article aquí .
0 votes
Avez-vous envisagé, plutôt que d'enregistrer graphiquement le contenu de l'écran, d'utiliser une système de relecture ?
0 votes
@PigBen C'était une lecture intéressante, mais je ne pense pas que ça marcherait. Il faudrait que j'accroche les événements d'une manière ou d'une autre, ce qui n'est pas faisable en utilisant une application générique, et il semble que je devrais faire un peu de piratage. Il en va de même pour le rendu.
2 votes
Vous n'avez pas besoin d'accrocher quoi que ce soit. Il suffit d'écrire vos événements d'entrée de manière à ce qu'ils ne contrôlent pas directement le jeu, mais appellent d'autres fonctions. Par exemple, si le joueur appuie sur la touche gauche, vous ne devez pas simplement décrémenter la position x du joueur. Au lieu de cela, vous appelez une fonction, comme
MovePlayerLeft()
. Et vous enregistrez également l'heure et la durée des pressions sur les touches et autres entrées. Ensuite, lorsque vous êtes en mode lecture, vous ignorez simplement l'entrée et vous lisez les données enregistrées. Si, dans les données, vous voyez une pression sur la touche gauche, vous appelezMovePlayerLeft()
.2 votes
@PigBen Ce sera une application générique pour enregistrer des séquences de jeu. Ce n'est pas pour un jeu spécifique. Quelqu'un qui appuie sur la touche gauche pourrait vouloir dire se déplacer vers la droite, pour ce que j'en sais. De plus, vous n'avez pas pris en compte les événements qui ne sont pas influencés par l'utilisateur. Et qu'en est-il du rendu ?
0 votes
Oh, ok. Je n'avais pas compris cette partie (le fait que ce soit une application externe). Mais pour ce qui est des événements qui ne sont pas influencés par l'utilisateur, ils seraient enregistrés aussi. Tout ce qui n'est pas déterministe dans votre jeu devrait être enregistré. Et le rendu serait géré par le moteur de jeu de la même manière que si quelqu'un jouait. (Ceci, bien sûr, ne s'applique pas à votre situation telle que je la comprends maintenant).
0 votes
Avez-vous testé les performances de
CreateOffscreenPlainSurface
yGetFrontBufferData
dans DirectX ? Je ne peux pas imaginer que cela puisse être plus lent que GDI+, .NET, Windows API, ou les autres méthodes disponibles.0 votes
@AJG85 Je n'ai pas fait de tests, mais d'autres personnes l'ont fait, avec des résultats qui confirment mes dires. Aussi, je cite la documentation de MSDN : "Cette fonction est très lente, par conception, et ne devrait pas être utilisée dans un chemin critique pour les performances." C'est parce que vous devez lire à partir de la RAM vidéo, ce qui est lent en raison de la latence CPU-GPU. L'API de .NET est simplement une enveloppe pour GDI, pour autant que je sache.
1 votes
@someguy Ok je suppose que vous faites quelque chose de beaucoup plus intense, j'avais ajouté une routine utilisant les méthodes ci-dessus pour sauvegarder des AVIs de relecture dans un jeu à environ 30fps sans problème. J'ai fait un enregistreur d'écran à plusieurs moniteurs en utilisant l'API de Windows pour "l'optimisation de la force de travail" mais cela a mal fonctionné même à 4fps.
0 votes
@AJG85 Par API Windows, parlez-vous de GDI ? Hmm, c'est surprenant que ses performances soient si mauvaises par rapport à celles de DirectX.
GetFrontBufferData
.0 votes
@someguy honnêtement, je pense que les mauvaises performances ont plus à voir avec les autres détails de mise en œuvre, principalement le streaming des images de plusieurs machines surveillées vers un seul service Windows pour l'archivage.
0 votes
Êtes-vous sûr que le truc de WME est plus rapide que GDI ? Il est possible qu'ils utilisent simplement GDI en dessous...
0 votes
@rogerdpack : En regardant de nouveau le lien codeprojects, il ne mentionne pas réellement que WME est plus rapide :/. J'ai mal lu, désolé. Quant à l'utilisation de GDI, je ne suis plus sûr.
1 votes
Il existe un pilote miroir open source pour Windows sur le site de dépôt d'UltraVNC ici ultravnc.svn.sourceforge.net/viewvc/ultravnc/
0 votes
Avez-vous écrit votre programme ? Je suis curieux.
0 votes
@bodacydo : J'ai commencé quelque chose il y a quelques années, mais c'était loin d'être terminé. Je ne me sentais pas à l'aise pour l'écrire parce que je sentais qu'il y avait beaucoup de lacunes dans mes connaissances, alors j'ai perdu la motivation. Si jamais j'ai le temps de lire quelques livres sur le sujet, je pourrais recommencer quelque chose.
0 votes
J'ai remarqué que vous n'avez accepté aucune réponse. Avez-vous trouvé ce que vous cherchiez ? Quelle est la conclusion (tampon arrière ou avant, directx ou autre chose) ?
0 votes
@anddero : J'ai d'abord accepté la réponse de Brandrew il y a plusieurs années, parce qu'elle semblait comme si c'était la meilleure solution, mais il n'y a aucune preuve de cela. J'accepterais une réponse si elle (1) montrait que sa solution est la plus rapide par rapport à certaines méthodes courantes ou (2) indiquait une source faisant autorité. Malheureusement, j'ai abandonné ce projet avant qu'il ne devienne vraiment substantiel.
0 votes
@someguy Êtes-vous en train de dire que c'est toujours une question ouverte ? Vous n'avez pas encore essayé ou évalué vous-même les différentes méthodes ? Je suis en train de faire des recherches sur la même chose en ce moment et je peux tenter le coup, car les sources faisant autorité sur ce sujet ne sont pas faciles à trouver en fait.
0 votes
@anddero : C'est exact. Je n'ai pas eu l'occasion d'évaluer l'une ou l'autre de ces méthodes. Je ne pense pas que je vais essayer de sitôt, car j'ai abandonné le projet. Ce serait formidable si vous pouviez essayer vous-même et rapporter vos résultats.