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 robin . Évalué à 5.
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 Tonton Th (Mastodon) . Évalué à 3.
… puis-je te conseiller http://www.mega-nerd.com/libsndfile/ ?
# erreur avant l'écriture
Posté par misaki43 . É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.