ffomnislash | Bonjour,
J'ai un pb avec speex qui me rend fous 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 :
- #define FRAME_SIZE 160
- short in[FRAME_SIZE];
- float input[FRAME_SIZE];
- char cbits[200];
- int nbBytes;
- void *state;
- SpeexBits bits;
- int tmp;
- state = speex_encoder_init(&speex_nb_mode);
- tmp=8;
- speex_encoder_ctl(state, SPEEX_SET_QUALITY, &tmp);
- speex_bits_init(&bits);
- //raw_data_int est un tableau de longueur len1 contenant des entiers
- for(int i=0;i<len1/FRAME_SIZE;i++)
- {
- //j'affiche un des elements de raw_data_int, entier non compressé
- printf("%d\n",raw_data_int[i]);
- for (int k=0;k<FRAME_SIZE;k++)
- input[k]=raw_data_int[k+i*FRAME_SIZE];
- /*Flush all the bits in the struct so we can encode a new frame*/
- speex_bits_reset(&bits);
- /*Encode the frame*/
- speex_encode(state, input, &bits);
- /*Copy the bits to an array of char that can be written*/
- nbBytes = speex_bits_write(&bits, cbits, 200);
- //j'envoie la chaine obtenue
- sendto(sock,cbits,L_Message,0,(struct sockaddr*)&serveur,l_serveur);
- //printf("%s\n",cbits);
- }
|
Lorsque je decompresse
Code :
- short out[FRAME_SIZE];
- float output[FRAME_SIZE];
- char cbits[200];
- int nbBytes;
- void *state;
- SpeexBits bits;
- int tmp;
- state = speex_decoder_init(&speex_nb_mode);
- tmp=1;
- speex_decoder_ctl(state, SPEEX_SET_ENH, &tmp);
- speex_bits_init(&bits);
- //len est egal au len1 de l'encodage
- for(i=0;i<len/FRAME_SIZE;i++)
- {
- recvfrom(sock,cbits,L_Message+1,0,(struct sockaddr*)&serveur,&l_serveur);
- /*Copy the data into the bit-stream struct*/
- speex_bits_read_from(&bits, cbits, strlen(cbits));
- /*Decode the data*/
- speex_decode(state, &bits, output);
- /*Copy from float to short (16 bits) for output*/
- for (int k=0;k<FRAME_SIZE;k++)
- tab[k+i*FRAME_SIZE]=(int)output[k];
- printf("%d\n",tab[i]); //Malheuresement ce printf n'est pas egal à celui de l'encodage
- }
|
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
|