Outil (ligne de commande) pour enregistrement audio

Bonjour,

Comme je ne comprenais pas grand chose au son sous Linux en particulier, et avec alsa, wasapi, pulse SDL2 et compagnie, j’ai décidé de prendre le taureau par les cornes et de tester (voir: https://framagit.org/ericb/audiorecord )

Alors, à force de tâtonner, j’ai un peu progressé, et j’ai créé une petite application (à compiler soi-même) qui permet d’enregistrer le son venant d’une webcam ( hw:1,0 d’après pulseaudio).

Important : je viens de tester … si vous voulez enregistrer la musique que vous êtes en train d’écouter, vous pouvez changer hw:1,0 par default dans le code pour le périphérique d’entrée:

Soit, dans alsa_record.cpp, la ligne

ar.set_sound_device("hw:1,0");

devient:

ar.set_sound_device("default");

Et vous pouvez enregistrer le bureau :slightly_smiling_face:

Tout est là (avec quelques explications) : https://github.com/ebachard/Linux_Alsa_Audio_Record

En fait, je n’ai pas encore terminé, mais ça fonctionne plutôt bien.

Merci d’avance si je pouvais avoir quelques retours :slight_smile:

1 Like

[mise à jour]

Bon, je n’ai pas eu de retour du tout, mais comme tout le monde s’en doutait, un outil en ligne de commande, c’est super facile à intégrer. Alors j’ai intégré (pour tests) alsa_recorder dans miniDart (voir les diff sur framagit) et l’enregistrement SON et IMAGE fonctionne. Attention : quand j’enregistre, je n’ai pour l’instant qu’un .mp4 avec les images et un .wav avec le son, mais on doit pouvoir les assembler avec ffmpeg pour vérifier qu’ils sont synchronisés, J’ajoute que la charge est de moins de 50% sur un coeur pendant l’enregistrement et c’est plutôt bien sans aucune optimisation. Côté mémoire, 2s de son en mémoire, ça doit ne pas gêner beaucoup :wink:

Il me reste encore pas mal de travail, car je dois attraper les deux flux et les multiplexer pour obtenir une vidéo finale synchronisée, mais c’est passionnant, et je mets les bouchées doubles pour y arriver rapidement.

Rappel : si j’arrive au bout, j’aurai créé mon propre logiciel qui permet de m’enregistrer pour mettre des courtes séquences de cours / exercices en ligne. Le tout sans aucune aide.

Enfin, j’ai peut-être trouvé encore mieux pour l’enregistrement, car je passe cette fois par SDL et la portabilité est quasi automatique pour Windows. Mais elle me semble bien buggée cette lib avec le son :-/

J’ajoute que j’ai mis à jour (je vais compléter prochainement si j’ai oublié quelque chose) pour compiler le logiciel sous Linux. Je suis parti d’une Linuxmint cinnamon 20.x et ça fonctionne plutôt très bien.

J’ai aussi mis en ligne la version Windows, mais je vais en mettre une nouvelle bientôt car j’ai -entre temps- corrigé un bug merd… avec l’antialiasing des polices (dû au HiDPI, qui nous empoisonne un peu, car ça devient difficile de passer d’une machine à l’autre facilement).

Merci d’avance pour toute aide.

Salut,

Ravi de savoir que tu t’amuses bien :slight_smile: et te voir te débrouiller comme ça tout seul, ça fait plaisir également :slight_smile:

J’ai regardé un peu ton code. A première vue, c’est plutôt propre. Juste un truc: peut-être penser à paramétriser le nom du device au lieu de le coder en dur dans ton code. Donc, le mieux serait d’en faire un argument à ta commande. Et si tu veux faire ça proprement également, il faudrait que tu regardes sur des outils plutôt standard. Genre getopt ou argp

Merci pour les compliments :slight_smile:

En fait, le code n’est pas propre, encore, car je dois le factoriser. En particulier, je dois mettre en oeuvre la classe Application, qui va « cacher » toutes les variables et fonctions « statiques » qu’on trouve un peu partout dans le programme principal, mais je le ferai peut-être après la 1.0, car c’est beaucoup de travail. Et pour l’instant, je préfère ajouter des fonctionnalités.

EDIT : Important : je parle de miniDart ici, plus de Linux Alsa Audio Recorder, qui n’était qu’une preuve de concept.

Il me manque encore plusieurs choses, mais c’est déjà très très utilisable. Je pense même dériver le logiciel en plein de petits logiciels différents. Par exemple, en physique, on peut enregistrer une expérience, et la revoir au ralenti (je permets de 5 à 60 images par seconde, onglet Atelier Analyse ). Je fais ça pour visualiser le mouvement apparent d’une corde tendue qui vibre, excitée par un haut parleur (oscillations forcées) mais aussi pour une cuve à onde etc.

Dès que je pourrai faire ce que je veux du son « capté », je dois ajouter de quoi dessiner en temps réel (oscilloscope !) et même de la FFT, donc ce n’est vraiment pas terminé !

Maintenant, pour te répondre, le périphérique codé en dur, c’est du hack car l’enregistrement ne fonctionne BIEN que depuis hier ! (note : j’ai mis un FIXME dans le code pour pas oublier de corriger).

LA difficulté, c’est d’utiliser en même temps les images (via v4l2 + OpenCV) et le son (via alsa + pulseaudio) venant du même périphérique SANS que celui-ci parte en vrille. Apparemment, c’est possible :slight_smile:

En réalité, le système découvre tout seul ce qui est branché, et les noms sont bien écrits, et le périphérique est bien celui que l’on veut: on le sélectionne, et ça fonctionne. C’est plus simple :wink:

=> j’ai créé une page de wiki pour illustrer ce que je raconte: Enregistrement

Et si cela t’intéresse, j’ai aussi écrit un canvas -basique- (en C++) et il y aura 8 billets sur developpez.com sur le sujet (je crois que l’article 1 est en ligne en actualité dans les publications)

À ceux qui lisent: il faut savoir ce que l’on fait pour tester ce logiciel, car il est en développement et surtout il ne faut pas oublier de faire des sauvegardes des vidéos qu’on lit avec. Vous l’utilisez à vos risques et périls !