URL: https://linuxfr.org/forums/programmation-c--2/posts/enregistrement-d-un-wav Title: Enregistrement d'un .wav Authors: misaki43 Date: 2015年05月28日T10:52:56+02:00 License: CC By-SA Tags: Score: 1 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 : ----------------------------------------------------------------------------------------------------------- ```c 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); } ``` ------------------------------------------------------------------------------------------------------------

AltStyle によって変換されたページ (->オリジナル) /