【发布时间】:2011-05-15 20:31:55
【问题描述】:
我正在使用 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 网站的示例编码/解码示例。 我不确定我在这里缺少什么。
【问题讨论】:
-
speex 是有损编解码器,生成的流将与原始流不同,因为您会丢失信息以实现更好的压缩。
-
@Paulo Scardine 如果我用来自正弦波的值对数组进行编码,则 20~ 第一个浮点数(一旦解码)都等于 0。我知道它是有损的,但我正在丢失大部分数据。我也得到了一些负值,而我有一些正值。
-
似乎是有符号/无符号数据类型问题。
-
它与签名/未签名数据有什么关系?
标签: c++ c encoding speex portaudio