Я использую speex для кодирования некоторых аудиоданных и отправки их по UDP и декодирования на другой стороне. Я провел несколько тестов с помощью speex и заметил, что если я декодирую пакет сразу после его кодирования, декодированные данные никоим образом не приблизятся к исходным данным. Большинство байтов в начале буфера равны 0. Итак, когда я декодирую звук, передаваемый по UDP, все, что я получаю, это шум. Это, как я кодирующая аудио:speex decoding going wrong
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;
}
это, как я декодирование аудио:
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);
Я проверить документы, и большая часть моего кода приходит из примера кодирования/декодирования с веб-сайта speex. Я не уверен, что мне здесь не хватает.
speex - кодек с потерями, результирующий поток будет отличаться от оригинала, потому что вы теряете информацию, чтобы добиться лучшего сжатия. – 2010-11-25 18:23:11
@Paulo Scardine, если я кодирую массив со значениями из синусоидальной волны, 20 ~ первые поплавки (после декодирования) равны 0. Я знаю, что это потеря, но там я теряю большую часть данных. Я также получаю некоторые значения neg, где у меня есть некоторые положительные значения. – dotminic 2010-11-25 18:33:13
выглядит как проблема типа подписанного/неподписанного типа. – 2010-11-25 19:24:08