Voir le flux RSS

ericb2

[Linux] Ressource : petite API pour s'enregistrer sous Linux

Noter ce billet
par , 11/09/2020 à 13h34 (628 Affichages)
Citation Envoyé par ericb2 Voir le message
Attention : LINUX seulement (je ne sais pas encore quoi faire pour Windows, mais ça viendra)

Bonjour,

Pour ceux que cela intéresse, j'ai écrit une petite application en C++ permettant de s'enregistrer (micro interne ou webcam) via alsa + pulse sous Linux (c'est souvent installé par défaut sous Linuxmint). Tout est ICI

La seule dépendance est la libasound2 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
$apt-cache search asound | grep libasound2

libasound2 - bibliothèque partagée pour les applications ALSA
libasound2-data - Fichiers de configuration et profils pour les pilotes ALSA
libasound2-dev - bibliothèque partagée pour les applications ALSA -- fichiers de développement
libasound2-doc - Documentation pour la programmation d'applications ALSA en espace utilisateur
libasound2-plugins - Plugins additionnels pour la bibliothèque ALSA

(quelques d'autres)
Pour installer la bonne bibliothèque :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
sudo apt-get install libasound2 libasound2-dev
Et ça devrait le faire :-)


Si vous voulez intégrer cette fonctionnalité dans votre logiciel, un exemple d'intégration est inclus dans les sources, mais quelquefois, c'est mieux de voir ce que ça donne en mode graphique et vous pouvez vous inspirer de l'exemple que j'ai donné dans miniDart,un autre logiciel que j'écris.

Méthode :

ajouter alsarecorder.hpp qu'on utilisera avec un #include "alsa_recorder.hpp"

Pour l'implémentation, il faudra ajouter alsa_recorder.cpp dans vos sources.

Pour l'utilisation :

Ajouter le fichier d'en-tête permettant de définir l'interface :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
#ifdef __LINUX
#include "alsa_recorder.hpp"
#include <thread>
#endif
Une fonction statique pour lancer l'enregistrement (parce que j'utilise std::thread, mais il doit y avoir une astuce pour faire autrement) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
static void start_audio_recording(AlsaRecorder * p_aRec);
Son implémentation aussi :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static void start_audio_recording(AlsaRecorder * p_aRec)
{
    //fname = filename;
    //std::cerr << "fname : " << fname << "\n";
    p_aRec->set_sound_device("default");
    p_aRec->init();

    int anErr = p_aRec->do_record();

    if (anErr !=  EXIT_SUCCESS)
        std::cout << "Pb with do_record() "  << "\n";

    std::cout << "Close wave file" << "\n";
    p_aRec->close_wav_file();

    std::cout << "Close default soundcard" << "\n";
    p_aRec->close_soundcard();
}




Dans la fonction principale, création d'une instance d'un objet de type AlsaRecorder (et d'un pointeur associé, plus pratique)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
    AlsaRecorder aRec;
    AlsaRecorder * p_aRec = &aRec;
Enfin, si on appuie sur le bouton (rappel : ImGui fonctionne en mode immédiat)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
                    if ((b_recording_checked) && (!b_recording_video))                           /// on vient d'appuyer sur le bouton "Enregistrer" ET on n'était pas en train d'enregistrer
                    {
                        if (strlen(defaultPath) == 0)
                        {
                            // open modal dialog : il faut définir un répertoire de travail
                            // dans lequel seront enregistrées les images
                            ImGui::OpenPopup(CURRENT_WORKING_DIRECTORY_POPUP);
                            if( ImGui::BeginPopupModal(CURRENT_WORKING_DIRECTORY_POPUP, NULL, ImGuiWindowFlags_AlwaysAutoResize))
                            {
                                ImGui::Text(HELP_CHOOSE_WORKING_REC_DIRECTORY);
                                ImGui::NewLine();

                                ImGui::Spacing(); ImGui::SameLine();
                                if (ImGui::Button(OK_BUTTON, ImVec2(120,0)))
                                {
                                    b_recording_checked = false;
                                    selectFolder(currentPath);
                                    ImGui::CloseCurrentPopup();
                                }
                                ImGui::EndPopup();
                            }
                        }
                        else
                        {
                            b_recording_video = true;
                            b_draw_recording_info = true;
                            b_startNewRecording = true;
                            std::cout << "Enregistrement en cours" << "\n";
                            inc_color();

                            p_aRec->set_quit(false);                                    // On vient d'appuyer sur "Enregistrer"

                            first = std::thread(*start_audio_recording, p_aRec);   // on lance le fil d'exécution en parallèle (enregistrement SON seulement ici)

                        }
                    }
                    else if ((!b_recording_checked) && (b_recording_video))  // on vient d'appuyer sur "Arrêter l'enregistrement"
                    {
                        b_recording_video = false;
                        b_draw_recording_info = false;

                        // stop audio recording
                        p_aRec->set_quit(true);      ///  Le booléen passe à VRAI => on arrête l'enregistrement
                        first.join();                         /// on termine le thread  

                        oVideoWriter.release();
                        std::cout << "Fin d'enregistrement" << "\n";
                    }

À la fin,vous obtenez un fichier .wav, mais j'ai proposé un script pour le convertir en mp3 sur github, pour ceux qui le souhaitent.

Merci d'avance pour tout retour constructif, toute aide ou même toute contribution (soyons fous ! )

Envoyer le billet « [Linux] Ressource : petite API pour s'enregistrer sous Linux » dans le blog Viadeo Envoyer le billet « [Linux] Ressource : petite API pour s'enregistrer sous Linux » dans le blog Twitter Envoyer le billet « [Linux] Ressource : petite API pour s'enregistrer sous Linux » dans le blog Google Envoyer le billet « [Linux] Ressource : petite API pour s'enregistrer sous Linux » dans le blog Facebook Envoyer le billet « [Linux] Ressource : petite API pour s'enregistrer sous Linux » dans le blog Digg Envoyer le billet « [Linux] Ressource : petite API pour s'enregistrer sous Linux » dans le blog Delicious Envoyer le billet « [Linux] Ressource : petite API pour s'enregistrer sous Linux » dans le blog MySpace Envoyer le billet « [Linux] Ressource : petite API pour s'enregistrer sous Linux » dans le blog Yahoo

Commentaires