我正在使用 speex 对一些音频数据进行编码并通过 UDP 发送,然后在另一端对其进行解码。我用 speex 进行了一些测试,并注意到如果我在编码后立即解码一个数据包,解码后的数据绝不会接近原始数据。缓冲区开头的大部分字节都是 0。所以当我解码通过 UDP 发送的音频时,我得到的只是噪音。这就是我编码音频的方式:
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 网站的示例编码/解码示例。我不确定我在这里缺少什么。