簡體   English   中英

Portaudio + Opus編碼/解碼音頻輸入

[英]Portaudio + Opus encoding / decoding audio input

我正在使用Portaudio和opus在VOIP客戶端上工作。 我從一個幀中讀取麥克風 - 使用Opus對每個幀進行編碼並將其放入列表--pop列表中的第一個元素並對其進行解碼 - 使用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,我嘗試使用單聲道和立體聲。

我究竟做錯了什么?

我自己解決了問題我改變了配置:采樣率為24000,每個緩沖區的幀數仍為480。

這是6年后,但我會為像我這樣的未來的google發布一個答案:

我有類似的問題並通過將PortAudio樣本類型更改為paInt32並從opus_decode_float切換到opus_decode來修復它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM