2

私は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 Web サイトのサンプル エンコード/デコード サンプルからのものです。ここで何が欠けているのかわかりません。

4

3 に答える 3

1

実際に話すと、オーディオデータに追加の遅延が発生します。

narrow band : delay = 200 - framesize + lookahead = 200 - 160 +  40 =  80 samples 

wide band   : delay = 400 - framesize + lookahead = 400 - 320 + 143 = 223 samples

uwide band  : delay = 800 - framesize + lookahead = 800 - 640 + 349 = 509 samples

先読みはzereosで初期化されるため、最初のいくつかのサンプルが「ゼロに近い」ことがわかります。

タイミングを正しくするには、コーデックにフィードした実際のオーディオデータを取得する前に、これらのサンプルをスキップする必要があります。それがなぜなのか、私にはわかりません。speexはストリーミング用であり、主にオーディオデータの保存と復元用ではないため、speexの作成者であるProbalbyはこれを気にしませんでした。(スペースを無駄にしないための)別の回避策は、実際のオーディオデータをフィードする前に、コーデックにゼロをフィード(framesize-delay)してから、最初のspeexフレーム全体をドロップすることです。

これですべてが明らかになることを願っています。Speexに精通している人がこれを読んだ場合、私が間違っていたら遠慮なく訂正してください。

編集:実際には、デコーダーとエンコーダーの両方に先読み時間があります。遅延の実際の式は次のとおりです。

narrow band : delay = decoder_lh + encoder_lh =  40 +  40 =  80 samples 

wide band   : delay = decoder_lh + encoder_lh =  80 + 143 = 223 samples

uwide band  : delay = decoder_lh + encoder_lh = 160 + 349 = 509 samples
于 2012-04-06T20:14:53.500 に答える
1

エンコードされたデータが非常に異なる理由がわかりました。Paulo Scardine が言ったように、非可逆圧縮であるという事実と、speex は 160 フレームでしか機能しないため、portaudio から speex にデータを取得するときは、160 フレームの「パケット」である必要があります。

于 2010-11-30T20:43:57.327 に答える
0

簡単なエンコード/デコードについては、こちらを ご覧ください。

UDP を使用しているため、ジッター バッファーを使用してパケットなどの順序を変更することもできます。

于 2010-11-25T20:34:31.070 に答える