IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langages Discussion :

[langage C] Enregistrer un son ".wav"


Sujet :

Langages

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 87
    Points : 49
    Points
    49
    Par défaut [langage C] Enregistrer un son ".wav"
    Bonjour,

    Je veux enregistrer un son en c dans un fichier.wav cependant la qualité du son ainsi enregistré est mauvais. Ceci n'est pas du à un problème de micro puisque sous audacity ça enregistre correctement.
    L'entête de mon .wav parait correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	riff: 'RIFF'
    	riff length: 184356
    	wave: 'WAVE'
    	fmt: 'fmt '
    	fmt length: 16
    	format: 1
    	channels: 2
    	sample rate: 44100
    	bytes/second: 176400
    	bytes/sample: 4
    	bits/sample: 16
    	data: 'data'
    	data length: 184320
    Puisque celui de audacity est pour un autre enregistrement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	riff: 'RIFF'
    	riff length: 328324
    	wave: 'WAVE'
    	fmt: 'fmt '
    	fmt length: 16
    	format: 1
    	channels: 2
    	sample rate: 44100
    	bytes/second: 176400
    	bytes/sample: 4
    	bits/sample: 16
    	data: 'data'
    	data length: 328288
    Les informations que j'enregistre sont du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -373	320	-87	365	-1295	1393
    alors que celle d'audacity sont de type :
    Voici maintenant mon code, je ne vous présente pas la création de l'entête puisqu'elle semble correcte.
    Configuration des micros
    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
       result = snd_pcm_open(&capture_handle, device_name, SND_PCM_STREAM_CAPTURE, 0);
       if (result < 0) EXIT_ON_SOUND_ERROR(result, " Cannot open audio device %s.\n\t You can give it as first argument. Default is 'hw:0,0'.", device_name);
       result = snd_pcm_hw_params_malloc(&hw_params);
       if (result < 0) EXIT_ON_SOUND_ERROR(result, "cannot allocate hardware parameter structure");
       result = snd_pcm_hw_params_any(capture_handle, hw_params);
       if (result < 0) EXIT_ON_SOUND_ERROR(result, "cannot initialize hardware parameter structure");
       result = snd_pcm_hw_params_set_access(capture_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED); //changer normalement "non ..." 
       if (result < 0) EXIT_ON_SOUND_ERROR(result, "cannot set access type");
       result = snd_pcm_hw_params_set_format(capture_handle, hw_params, SND_PCM_FORMAT_S16_LE);
       if (result < 0) EXIT_ON_SOUND_ERROR(result, "cannot set sample format");
       result = snd_pcm_hw_params_set_rate_near(capture_handle, hw_params, &sample_rate, &dir);
       if (result < 0) EXIT_ON_SOUND_ERROR(result, "cannot set sample rate");
       result = snd_pcm_hw_params_set_channels(capture_handle, hw_params, 2);
       if (result < 0) EXIT_ON_SOUND_ERROR(result, "cannot set channel count");
       result = snd_pcm_hw_params(capture_handle, hw_params);
       if (result < 0) EXIT_ON_SOUND_ERROR(result, "cannot set parameters");
       snd_pcm_hw_params_free(hw_params);
       result = snd_pcm_prepare(capture_handle);
       if (result < 0) EXIT_ON_SOUND_ERROR(result, "cannot prepare audio interface for use");
    Récupération des données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       int16_t buf[BUFFER_SIZE*2] = { 0 }; // A verifier pourquoi il faut qu'il soit static, sinon seg fault. Ca interdit le multithreading !!!
       int16_t org[BUFFER_SIZE]= { 0 }, ord[BUFFER_SIZE]={0};
     
          if ((result = snd_pcm_readi(sound->capture_handle, buf, BUFFER_SIZE)) != BUFFER_SIZE)
          {
            if (result == -EPIPE)
            {
              snd_pcm_recover(sound->capture_handle, result, 0);
              PRINT_WARNING("Miss sound sample");
            }
            else EXIT_ON_SOUND_ERROR(result, "read from audio interface '%s' failed %d\n", sound->device_name, result);
          }
    Enregistrement des données :
    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
     
    	for(j=0; j< BUFFER_SIZE; j++)
         {
    		spectrum_l[j] = (float) buf[j * 2] / (float)(1 << 15);
    		spectrum_r[j] = (float) buf[j * 2 + 1] / (float)(1 << 15) ;
    		org[j] = buf[j*2]; //parce que je veux enregistrer le canal 1 ("oreille gauche") de manière séparé au canal 2
    		ord[j] = buf[j*2 + 1]; // idem
    	 } 
     
          if((fpr !=NULL)&&(fpr !=NULL))
          {
    		  /*Il faut tout d'abord modifier l'entête : en effet il y a des données en plus donc la taille du fichier change */
    		  fseek(fpr, 4, SEEK_SET);
    		  fseek(fpl, 4, SEEK_SET);
    		  val = 44 + BUFFER_SIZE*(sound->nbIt)*2 -8;
    		  fwrite(&val, sizeof(int32_t), 1, fpr);
    		  fwrite(&val, sizeof(int32_t), 1, fpl);
    		  /*Il y a auussi le nombre de données qui change*/
    		  fseek(fpr, 40, SEEK_SET);
    		  fseek(fpl, 40, SEEK_SET);
    		  val= (sound->nbIt)*BUFFER_SIZE*2;//nbCan*nbEch*bitParEch/2
     
    		  fwrite(&val, sizeof(int32_t), 1, fpr);
    		  fwrite(&val, sizeof(int32_t), 1, fpl);
    		  /*Finalement, on ajoute une ligne en fin de fichier avec les données*/
    		  fseek(fpr, 0, SEEK_END);
    		  fseek(fpl, 0, SEEK_END);
    		  fwrite(ord, (BUFFER_SIZE)*sizeof(int16_t), 1, fpr);
    		  fwrite(org, (BUFFER_SIZE)*sizeof(int16_t), 1, fpl);
    	  }else printf("erreur fp / fr null quand on veut remplir\n");
    }
    EDIT : En fait le changement de type de valeurs peut aussi s'expliquer par un éloignement différent entre moi et les micros...

    Voyez vous une erreur qui pourrait expliquer mon problème ?

    Merci,

    Oriane

  2. #2
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 87
    Points : 49
    Points
    49
    Par défaut
    Bonsoir,

    Désolé pour ce double post mais je me rends compte que je n'ai pas crée la discussion au bon endroit : pouvez vous me le deplacer partie programmation ?

    Désolé pour la gêne et merci,

    Misaki43

Discussions similaires

  1. [WD15] Enregistrer un son WAV
    Par dakota77 dans le forum WinDev
    Réponses: 1
    Dernier message: 19/12/2010, 18h43
  2. Enregistrer un son WAV
    Par dakota77 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 22/12/2008, 11h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo