[Speex] pb encodage

pb encodage [Speex] - C - Programmation

Marsh Posté le 06-12-2004 à 17:33:15    

Bonjour,
 
J'ai un pb avec speex qui me rend fous  :pt1cable:  
 
J'ai un tableau d'entier, qui en faite est de la voix.
Mon but est de le compresser, de l'envoyer en UDP puis de le decompresser
 
J'ai écrit le code seulement ce dernier ne fonctionne pas.
Les entier apres décodage ne corresponde pas à ceux d'avant encodage.
Je precise tout de suite que la chaine envoyée sur le réseau est égal à celle recus donc pas de probleme de ce coté la.
 
Voici la partie du code incriminée:
 
 
Lorsque je compresse

Code :
  1. #define FRAME_SIZE 160
  2. short in[FRAME_SIZE];
  3. float input[FRAME_SIZE];
  4. char cbits[200];
  5. int nbBytes;
  6. void *state;
  7. SpeexBits bits;
  8. int tmp;
  9. state = speex_encoder_init(&speex_nb_mode);
  10. tmp=8;
  11. speex_encoder_ctl(state, SPEEX_SET_QUALITY, &tmp);
  12. speex_bits_init(&bits);
  13. //raw_data_int est un tableau de longueur len1 contenant des entiers
  14. for(int i=0;i<len1/FRAME_SIZE;i++)
  15. {
  16.         //j'affiche un des elements de raw_data_int, entier non compressé
  17. printf("%d\n",raw_data_int[i]);
  18. for (int k=0;k<FRAME_SIZE;k++)
  19.  input[k]=raw_data_int[k+i*FRAME_SIZE];
  20. /*Flush all the bits in the struct so we can encode a new frame*/
  21. speex_bits_reset(&bits);
  22. /*Encode the frame*/
  23. speex_encode(state, input, &bits);
  24. /*Copy the bits to an array of char that can be written*/
  25. nbBytes = speex_bits_write(&bits, cbits, 200);
  26. //j'envoie la chaine obtenue
  27. sendto(sock,cbits,L_Message,0,(struct sockaddr*)&serveur,l_serveur);
  28. //printf("%s\n",cbits);
  29. }


 
 
 
Lorsque je decompresse

Code :
  1. short out[FRAME_SIZE];
  2. float output[FRAME_SIZE];
  3. char cbits[200];
  4. int nbBytes;
  5. void *state;
  6. SpeexBits bits;
  7. int  tmp;
  8. state = speex_decoder_init(&speex_nb_mode);
  9. tmp=1;
  10. speex_decoder_ctl(state, SPEEX_SET_ENH, &tmp);
  11. speex_bits_init(&bits);
  12. //len est egal au len1 de l'encodage
  13. for(i=0;i<len/FRAME_SIZE;i++)
  14. {
  15. recvfrom(sock,cbits,L_Message+1,0,(struct sockaddr*)&serveur,&l_serveur);
  16. /*Copy the data into the bit-stream struct*/
  17.        speex_bits_read_from(&bits, cbits, strlen(cbits));
  18.        /*Decode the data*/
  19.        speex_decode(state, &bits, output);
  20.        /*Copy from float to short (16 bits) for output*/
  21.        for (int k=0;k<FRAME_SIZE;k++)
  22.          tab[k+i*FRAME_SIZE]=(int)output[k];
  23. printf("%d\n",tab[i]); //Malheuresement ce printf n'est pas egal à celui de l'encodage
  24. }


 
 
Petites précisions
- les données apres decodage sont plus petites que celle avant encodage
- La première donnée après décodage est toujours 13 (en entier)
 
Je ne voit pas d'ou vient le problême étant donné que j'utilise en grande partie le code donné dans la doc de speex


Message édité par ffomnislash le 06-12-2004 à 17:36:39
Reply

Marsh Posté le 06-12-2004 à 17:33:15   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed