J'utilise speex pour encoder des données audio et les envoyer via UDP, et les décoder de l'autre côté. J'ai effectué quelques tests avec speex, et j'ai remarqué que si je décode un paquet directement après l'avoir encodé, les données décodées ne sont en aucun cas proches des données d'origine. La plupart des octets au début de la mémoire tampon sont 0. Donc, quand je décode l'audio envoyé sur UDP, tout ce que je reçois, c'est du bruit. Voilà comment je suis l'encodage audio:Le décodage de speex se passe mal
bool AudioEncoder::encode(float *raw, char *encoded_bits)
{
for (size_t i = 0; i < 256; i++)
this->_rfdata[i] = raw[i];
speex_bits_reset(&this->_bits);
speex_encode(this->_state, this->_rfdata, &this->_bits);
int bytesWritten = speex_bits_write(&this->_bits, encoded_bits, 512);
if (bytesWritten)
return true;
return false;
}
c'est ainsi que je décoder les audio:
float *f = new float[256];
// recvbuf is the buffer I pass to my recv function on the socket
speex_bits_read_from(&this->_bits, recvbuf, 512);
speex_decode(this->state, &this->_bits, f);
J'ai vérifier les documents, et la plupart de mon code provient de l'exemple échantillon d'encodage/décodage du site web de speex. Je ne suis pas sûr de ce qui me manque ici.
speex est un codec avec perte, le flux résultant sera différent de l'original car vous perdez des informations afin d'obtenir une meilleure compression. –
@Paulo Scardine si je code un tableau avec les valeurs d'une onde sinusoïdale, les 20 ~ premiers flotteurs (une fois décodés) sont tous égaux à 0. Je sais que c'est un problème, mais je perds la plupart des données. J'ai aussi des valeurs neg où j'avais des valeurs positives. – dotminic
semble être un problème de type de données signé/non signé. –