【问题标题】:Portaudio + Opus encoding / decoding audio inputPortaudio + Opus 编码/解码音频输入
【发布时间】:2012-11-19 14:14:27
【问题描述】:

我正在使用 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,我尝试了单声道和立体声。

我做错了什么?

【问题讨论】:

    标签: c++ audio voip portaudio opus


    【解决方案1】:

    6 年后,但我会为像我这样的未来谷歌人发布答案:

    我遇到了非常相似的问题,并通过将 PortAudio 样本类型更改为 paInt32 并将 opus_decode_float 切换为 opus_decode 来修复它

    【讨论】:

      【解决方案2】:

      我自己解决了这个问题,我更改了配置:采样率为 24000,每个缓冲区的帧数仍为 480。

      【讨论】:

      • 您能否在此处提供有关修复的更多见解?你用的是什么尺寸的包?根据答案,听起来您正在寻找一个 20 毫秒的数据包,但仅以 48 kHz 的采样率提供 10 毫秒的音频。将其更改为 24kHz 意味着 480 个样本现在覆盖 20ms。这是准确的吗?还是我错过了什么?
      猜你喜欢
      • 1970-01-01
      • 2013-05-05
      • 2015-08-07
      • 2020-01-07
      • 2019-01-09
      • 2016-10-25
      • 2014-12-11
      • 2014-10-17
      • 2020-09-24
      相关资源
      最近更新 更多