Forum Programmation.c Enregistrement d'un .wav

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
28
mai
2015

Bonjour,

J'essaie d'enregistrer du son dans un format .wav, mais lorsque j'écoute le son, ce que j'ai enregistré est ralenti et plus grave, avez vous une idée de pourquoi ?
Déjà il faut savoir que je ne suis pas sure du "type" auquel doit correspondre le buffer lors de la récuperation audio "snd_pcm_readi(sound->capture_handle, buf, BUFFER_SIZE)" (pour l'instant mis de type int16_t puisque j'ai une carte sonore de type "SND_PCM_FORMAT_S16_LE"

Si vous ne voyez pas d'erreur je peux aussi donner les paramètres liés à la carte son.

Voici donc une partie du code où il y a sûrement l'erreur :


        if ((result = snd_pcm_readi(sound->capture_handle, buf, BUFFER_SIZE)) != BUFFER_SIZE)
      { // ici buf est de type int16_t mais je ne suis pas sure
        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);
      }
      sound->nbIt++;

    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]; 

/* c'est bizarre mais le buffer contient des informations de taille "double" (i.e. je dis que j'enregistre BUFFER_SIZE info mais il en contient BUFFER_SIZE*2 : je me suis dit que c'etait parce que la taille correspondait à l'information d'un unique channel mais ici c'est une hypothese */
        ord[j] = buf[j*2 + 1];
     } 


      if((fpr !=NULL)&&(fpr !=NULL))
      {
          /*Il faut tout d'abord modifier l'entête (qui a été faite à un autre endroit mais qui parait correct en relecture). 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*sizeof(int16_t)*(sound->nbIt)*2*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*sizeof(int16_t)*2*2;//nbCan*nbEch*bitParEch/8

          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);
      }

  • # idée

    Posté par  . Évalué à 5.

    J'essaie d'enregistrer du son dans un format .wav, mais lorsque j'écoute le son, ce que j'ai enregistré est ralenti et plus grave,

    Je ne m'y connais pas très bien en format audio, mais il me semble que ça pourrait venir d'un problème de bitrate. Typiquement, tu as dû l'enregistrer à 48 000 Hz, et tu doit essayer de le lire à 41 100 Hz.

    bépo powered

  • # Pour manipuler des fichiers sons...

    Posté par  (Mastodon) . Évalué à 3.

    … puis-je te conseiller http://www.mega-nerd.com/libsndfile/ ?

  • # erreur avant l'écriture

    Posté par  . Évalué à 0.

    Merci je garde en tête cette librairie !
    Mais ne fait j'ai voulu tester de "réecouté" directement le buffer que j'ai récupéré à l'aide de mes micros en le transferant à mes hauts parleur et je peux déjà voir qu'il y a un problème…

    Je pense donc que le problème n'est finalement même pas au niveau de l'enregistrement :
    c
    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);
    }
    /*TEST SORTIE*/
    printf("avant ecriture\n");
    if ((result = snd_pcm_writei (sound->playback_handle, buf, BUFFER_SIZE)) != BUFFER_SIZE)
    {
    if( result == -EPIPE)
    {
    snd_pcm_recover(sound->playback_handle, result, 0);
    PRINT_WARNING("Don't right sound sample");
    }
    else EXIT_ON_SOUND_ERROR (result, "write to audio interface failed (%s)\n", sound->device_name);
    }

    Avec buffer_size = 1024, une fréquence de 44100Hz ; SND_PCM_ACCESS_RW_INTERLEAVED ; SND_PCM_FORMAT_S16_LE et 2 canaux comme informations utiles.

    Avez vous une idée de pourquoi je ne récupère qu'un bruit moche ?

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.