Question

Je suis censé fournir à mes utilisateurs un moyen très simple de capturer des clips vidéo à partir de la fenêtre principale de mon application OpenGL. Je songe à ajouter des boutons et / ou des raccourcis clavier pour démarrer et arrêter la capture; au début, je pourrais demander un nom de fichier et d’autres options, le cas échéant. Il doit fonctionner sous Windows (XP / Vista), mais je ne voudrais pas non plus fermer la porte de Linux que j'ai pu garder ouverte jusqu'à présent.

L’application utilise des programmes OpenGL fragment et shader, effets pour lesquels j’ai absolument besoin d’avoir dans les vidéos éventuelles.

Il me semble qu'il pourrait même y avoir plusieurs approches différentes susceptibles de répondre à mes besoins (mais je ne sais pas vraiment par où commencer):

  • Une bibliothèque de codage avec des fonctions telles que startRecording (nom du fichier), stopRecording et captureFrame. Je pourrais appeler captureFrame () après chaque image rendue (ou chaque seconde / troisième / peu importe). Si cela ralentit mon programme, ce n'est pas vraiment un problème.

  • Un programme externe autonome pouvant être contrôlé par programme à partir de mon application. Après tout, un programme autonome qui ne peut pas être contrôlé fait presque ce dont j'ai besoin ... Mais comme cela a été dit, il devrait être très simple à utiliser pour les utilisateurs, et j'apprécierais également la transparence; mon application fonctionne généralement en plein écran. En outre, il devrait être possible de distribuer le package d'installation de mon application, que je prépare actuellement avec NSIS.

  • Utilisez l’API Windows pour capturer des captures d’écran image par image, puis utilisez (par exemple) l’un des bibliothèques mentionnées ici . Il semble assez facile de trouver des exemples montrant comment capturer des captures d'écran dans Windows. Cependant, j'aimerais une solution qui ne me force pas vraiment à me salir les mains au niveau de WinAPI.

  • Utilisez OpenGL pour effectuer le rendu dans une cible hors écran, puis utilisez une bibliothèque pour produire la vidéo. Je ne sais pas si c'est même possible, et j'ai bien peur que ce ne soit pas le chemin de la moindre douleur de toute façon. En particulier, je ne voudrais pas que le rendu réel prenne un chemin d'exécution différent selon que la vidéo est capturée ou non. De plus, j'éviterais tout ce qui pourrait diminuer la cadence en mode normal sans capture.

Si la solution était libre dans l'un ou l'autre sens du terme, alors ce serait formidable, mais ce n'est pas vraiment une exigence absolue. En général, moins il y a de ballonnement, mieux c'est. Par ailleurs, pour des raisons autres que cette question, je ne peux malheureusement pas créer de lien dans un code uniquement sous GPL.

En ce qui concerne le format de fichier, je ne peux pas m'attendre à ce que mes utilisateurs commencent à rechercher Google pour des codecs, mais tant que l'affichage des vidéos est assez simple pour un utilisateur Windows de base, je ne le fais pas. se soucie vraiment de ce que le format est. Cependant, il serait intéressant de pouvoir contrôler la qualité de compression de la sortie.

Juste pour préciser: je n'ai pas besoin de capturer une vidéo à partir d'un périphérique externe tel qu'un caméscope, et je ne suis pas vraiment intéressé par les mouvements de la souris, même si les obtenir ne nuit pas non plus. Il n'y a pas d'exigences concernant l'audio; l'application ne fait aucun bruit.

J'écris en C ++ à l'aide de Visual Studio 2008, car cette application tire également parti de GLUT et de GLUI. Je comprends très bien le C ++, les liens dans les bibliothèques et ce genre de choses, mais OpenGL est tout à fait nouveau pour moi: jusqu'à présent, je n'ai vraiment appris que les éléments nécessaires pour que mon travail soit réellement fait.

Je n'ai pas besoin d'une solution urgente, alors n'hésitez pas à prendre votre temps :))

Était-ce utile?

La solution

Il y a deux questions différentes ici: comment extraire des images d'une application OpenGL et comment les transformer en fichier vidéo.

La première question est assez simple. vous venez de saisir chaque image avec glReadPixels () (via un PBO si vous avez besoin de la performance).

La deuxième question est un peu plus difficile, car les solutions multiplates-formes (ffmpeg) ont tendance à être GPL ou LGPL. LGPL est-il acceptable pour votre projet? La façon de procéder de Windows (DirectShow) est un casse-tête à utiliser.

Modifier: Comme LGPL est ok et que vous pouvez utiliser ffmpeg, consultez ici pour un exemple de codage vidéo.

Autres conseils

Cela est très pertinent pour la fusion dans un fichier AVI ( comme suggéré par Andrew), mais j’espérais vraiment éviter les LPBITMAPINFOHEADER, etc.

Merci pour les réponses, je ferai un rapport sur le succès s'il y en a:)

En attendant, des astuces supplémentaires pour encoder les images brutes de glReadPixels dans des clips vidéo seraient appréciées.

Modifier: Jusqu'à présent, le mot ffmpeg suggéré par Mike F semble être la voie à suivre. Cependant, je ne suis pas encore entré dans la mise en œuvre, mais j'espère que cela changera dans un proche avenir!

L'option la plus simple consiste à enregistrer chaque image rendue à partir de votre application, puis à les fusionner en un fichier AVI. Lorsque vous disposez de l’AVI, de nombreuses bibliothèques sont disponibles pour le convertir en un format plus optimal ou éventuellement ignorer l’étape AVI.

Pour obtenir chaque image, vous pouvez le faire en affichant la texture hors écran comme vous le suggérez ou en utilisant le tampon de fond directement comme source si votre matériel le permet. Faire l'une ou l'autre (et sauvegarder chaque image) va être difficile sans une lourde pénalité pour le nombre d'images par seconde.

Si votre application est déterministe, vous pouvez "enregistrer". les actions des utilisateurs sous forme d’une série d’entrées, puis d’un mode d’exportation qui les restitue de manière séquentielle sur une surface hors écran pour générer l’AVI.

Je devais créer un projet de démonstration consistant à enregistrer un rendu OpenGL dans une vidéo. J'ai utilisé glReadPixels pour obtenir les données de pixel et créé la vidéo avec cvWriteFrame d'OpenCV. OpenCV vous permet d’écrire en divx ou même en x264 / vp8 (avec ffmpeg compilé dedans).

J'ai un article plus détaillé sur mon blog avec un exemple de projet. http://tommy.chheng.com/ 2013/09/09 / encode-opengl à vidéo-avec-opencv /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top