私はspeexを使っていくつかのオーディオデータをエンコードし、UDPで送信し、反対側でデコードしています。 私はspeexを使っていくつかのテストを行いました。パケットをデコードすると、デコードされたデータは元のデータに近くなりません。バッファの先頭にあるほとんどのバイトは0です。 したがって、UDPで送信されたオーディオをデコードすると、ノイズが発生します。 これは私がオーディオをコードしています方法です:speexのデコードが間違っています
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のWebサイトから取得します。 私はここで何が欠けているのか分かりません。
speexは非可逆コーデックです。より良い圧縮を実現するために情報が不足しているため、結果のストリームは元のものとは異なります。 –
@Paulo Scardine正弦波の値を持つ配列をエンコードすると、20〜最初の浮動小数点(一度デコードされた)はすべて0になります。それは損失が多いことがわかりますが、データの大部分が失われています。私はまた、いくつかの正の価値を持っているいくつかのネガティブな価値を得る。 – dotminic
は、符号付き/符号なしのデータ型の問題のようです。 –