Opus编解码器在编码和解码时每帧丢失1/3

问题描述

此开发工作全部在stm32h743ZI2 Nucleo开发板上用C语言完成,而我试图为该基本示例所做的一切就是生成2KHz正弦波,编码单个帧,然后立即对其进行解码,因此看起来与Opus提供的trivial_example.c代码非常相似。

编码器和解码器似乎都在工作,但是我可能缺少一些设置,因为解码后的正弦波的前三分之一仅在0上下略微振荡。

以下是我用于编码/解码的设置:

  • 帧大小= 960(20毫秒)
  • 采样率= 48000
  • 位深度= 16位(+/- 32768)
  • 比特率= 24000
  • 渠道= 1
  • 应用程序= VOIP
TexturesHandler::init().TexturesHandler();

这是用于生成正弦波的函数

#define FRAME_SIZE 960      // 20ms frame size (sample_rate * ms = frame_size)
#define SAMPLE_RATE 48000
#define BITRATE 24000
#define BITDEPTH 16
#define CHANNELS 1
#define APPLICATION OPUS_APPLICATION_VOIP
#define MAX_FRAME_SIZE 6*960
#define MAX_PACKET_SIZE (3*1276)

这是我用来编码/解码框架的功能

void generate_sinewave(opus_int16 *buf)
{
    float pi = 3.141592;
    float w;
    float yi;
    opus_int16 sin_data[n_points];
    int i;

    yi = 0;
    w = 2  * pi * 2000 / SAMPLE_RATE;
    for(i = 0; i <= n_points; i++)
    {
        sin_data[i] = 32000 * sin(yi);
        yi = yi + w;
    }

    memcpy(buf,sin_data,sizeof(sin_data));
}

这些是从输入正弦波到编码器的输出,以及从解码器输出的正弦波:

Input Sine Wave

Output Sine Wave

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)