Ffmpeg-cpp2 (enregistrement audio+vidéo avec webcam)

Bonjour,

Je voulais signaler un logiciel que j’ai forké car il n’avançait pas, et le mec n’en avait que pour Windows.

=> Il s’agit de ffmpeg, mais en C++.

Et après avoir bataillé pendant un mois, j’ai réussi à créer plusieurs petites démos dont une dans laquelle, en quelques lignes, on peut s’enregistrer avec une webcam (son et image, synchronisé) sous Linux, et sortir une vidéo type .mp4 (h264 et aac pour les codecs).

Personnellement, je pense m’en servir pour enregistrer des petites vidéos pour des parties de cours, ou des démonstrations, des corrections d’exercices, et peut-être dans miniDart

Si vous êtes intéressés, tout est sur framagit (j’ai maintenu la version originale du code sur github, pour garder une trace de tout ce que j’ai modifié)

Toute aide est bienvenue (surtout pour finaliser le code), et si vous avez des questions : ouvrir une issue, c’est la bonne méthode.

Lien : https://framagit.org/ericb/ffmpeg-cpp2 <= le projet maintenu)

(fork original : https://github.com/ebachard/ffmpeg-cpp ) <= même si j’ai mis à jour, n’attendez plus rien ici

Important: on peut aussi (voir les démos) prendre la bande son d’une vidéo, et mélanger avec les images d’une autre (demultiplexage, multiplexage, les filres marchent super bien rotation, crop, resizing, etc). Les possibilités sont impressionnantes, et savoir qu’on peut l’intégrer dans du code, je l’avais pas vu avant. Pour la licence, j’ai mis GPL pour protéger mon travail du pillage, mais si ça devient connu, peut-être que je ferai ce qu’il faut (ne plus utiliser h264) pour repasser en LGPL.

Prochain objectif (devrait aller vite) : faire une application avec ImGui pour la partie graphique sous Linux.

Remarque : je sais, une partie du code a été mal écrite (pb de visibilité des contextes audio et vidéo), ce qui m’a forcé à utiliser des threads), mais je ne l’ai pas vu tout de suite. => ce sera amélioré dans une prochaine version :wink:

Bonjour ericb,

Ça c’est une bonne idée un wrapper C++ !
Je me rappelle m’être bien cassé la tête pour utiliser ffmpeg dans un projet C++ il y a une paire d’année. Il y avait peu de documentation sur comment l’utiliser, et j’utilisais l’interface en C. Avec ton projet on a non seulement l’interface C++, mais aussi les exemples. La prochaine fois que j’aurais besoin de faire de l’encodage dans un programme je saurai vers quoi me tourner !

Bravo pour le travail :slight_smile:

Bonjour,

Merci beaucoup pour les encouragements :slight_smile:

Pour information, j’ai forké le code initial, car j’étais un peu bloqué dans la partie en rouge et en orange sur ce schéma : https://framagit.org/ericb/miniDart/-/wikis/Description-technique-de-miniDart

Maintenant que je peux enregistrer vidéo et son synchronisés, il me manque 3 choses (WIP) :

  • recevoir un flux de cv::Mat dans ffmpeg-cpp (en fait, je sais déjà faire)
  • enregistrer le son via SDL2 : j’y suis presque, ce qui permettra de mélanger n’importe qu’elle source image ou son, et en faire une vidéo.
  • l’accélération matérielle via VAAPI + ffmpeg-cpp pour pouvoir faire ça avec une machine à 300 euros (c’est déjà le cas)

Et je n’ai pas parlé de ImGui::Plot, et de tout ce que j’ai en tête, mais ça viendra

Ensuite, je pourrai passer à la couche réseau :wink:

Pour ne pas surcharger ici, j’ai un peu commenté le code de remux_webcam sur ce blog

Voir ce lien : https://www.developpez.net/forums/blogs/1525847-ericb2/b9478/produire-videos-audio-p-video-synchronises-sous-linux-prix-webcam/

Bonne fin de semaine à tous,
Eric