Ich verwende Speex, um einige Audiodaten zu kodieren und es über UDP zu senden und es auf der anderen Seite zu decodieren. Ich habe ein paar Tests mit Speex durchgeführt und festgestellt, dass, wenn ich ein Paket dekodiere, direkt nachdem ich es codiert habe, die decodierten Daten in keiner Weise nah an den ursprünglichen Daten sind. Die meisten Bytes am Anfang des Puffers sind 0. Also, wenn ich das über UDP gesendete Audio dekodiere, bekomme ich nur Rauschen. Dies ist, wie ich das Audio-bin kodiert:speex Decodierung geht falsch
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;
}
das ist, wie ich das Audio-Decodierung am:
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);
Ich habe die Dokumentation überprüfen, und die meisten meinen Code stammt aus dem Beispiel Codieren/Decodieren eines Samples von der Speex-Website. Ich bin mir nicht sicher, was ich hier vermisse.
speex ist ein verlustbehafteter Codec, der resultierende Stream wird anders sein als original, weil Sie Informationen verlieren, um eine bessere Komprimierung zu erreichen. –
@Paulo Scardine Wenn ich ein Array mit den Werten einer Sinuswelle kodiere, sind die 20 ~ ersten Floats (einmal decodiert) alle gleich 0. Ich weiß, dass es verlustreich ist, aber da verliere ich die meisten Daten. Ich bekomme auch einige negative Werte, wo ich positive Werte habe. – dotminic
scheint wie ein signed/unsigned-Datentyp-Problem. –