5

私はPortaudioとopusを使用してVOIPクライアントに取り組んでいます。フレーム内のマイクから読み取ります-Opusで各フレームをエンコードしてリストに入れます-リストの最初の要素をポップしてデコードします-portaudioで読み取ります

サウンドをエンコードせずに同じことを行うと、うまく機能します。しかし、Opusを使用すると、音が悪くなり、音声が理解できなくなります(これは、VoIPクライアントにとっては悪いことです)。

HandlerOpus::HandlerOpus(int sample_rate, int num_channels)
    {
        this->num_channels = num_channels;
        this->enc = opus_encoder_create(sample_rate, num_channels, OPUS_APPLICATION_VOIP, &this->error);
        this->dec = opus_decoder_create(sample_rate, num_channels, &this->error);

        opus_int32 rate;

        opus_encoder_ctl(enc, OPUS_GET_BANDWIDTH(&rate));
        this->encoded_data_size = rate;
    }

    HandlerOpus::~HandlerOpus(void)
    {
        opus_encoder_destroy(this->enc);
        opus_decoder_destroy(this->dec);
    }

    unsigned char *HandlerOpus::encodeFrame(const float *frame, int frame_size)
    {
        unsigned char *compressed_buffer;
        int ret;

        compressed_buffer = new (unsigned char[this->encoded_data_size]);
        ret = opus_encode_float(this->enc, frame, frame_size, compressed_buffer, this->encoded_data_size);
        return (compressed_buffer);
    }

    float *HandlerOpus::decodeFrame(const unsigned char *data, int frame_size)
    {
        int ret;
        float *frame = new (float[frame_size * this->num_channels]);

        opus_packet_get_nb_channels(data);
        ret = opus_decode_float(this->dec, data, this->encoded_data_size, frame, frame_size, 0);
        return (frame);
    }

Opusを使用する必要があるライブラリを変更できません。サンプルレートは48000、バッファあたりのフレーム数は480で、モノラルとステレオで試してみました。

私は何が間違っているのですか?

4

2 に答える 2

1

私は自分で問題を解決しました。設定を変更しました。サンプルレートを 24000 に変更し、バッファあたりのフレーム数は 480 のままです。

于 2012-12-01T16:43:52.807 に答える
1

6 年後ですが、私のような将来の Google 社員のために回答を投稿します。

非常によく似た問題があり、PortAudio サンプル タイプを paInt32 に変更して修正し、opus_decode_float から opus_decode に切り替えました。

于 2018-10-13T14:56:36.847 に答える