C++ 解码OPUS音频流时的慢动作效果

C++ 解码OPUS音频流时的慢动作效果,c++,opus,C++,Opus,我正在捕获一个语音聊天程序的音频流(它是专有的、封闭源代码,我对它没有控制权),该程序使用进行编码,我想将其解码为原始PCM音频() 我正在做的是: 创建OPUS解码器:opusDecoder=OPUS\u解码器\u创建(48000,1,&opusResult) 解码流:opusResult=opus_解码(opusDecoder,voicePacketBuffer,voicePacketLength,pcm,9600,0) 将其保存到文件:pcmFile.write(pcm,opusResul

我正在捕获一个语音聊天程序的音频流(它是专有的、封闭源代码,我对它没有控制权),该程序使用进行编码,我想将其解码为原始PCM音频()

我正在做的是:

  • 创建OPUS解码器:
    opusDecoder=OPUS\u解码器\u创建(48000,1,&opusResult)
  • 解码流:
    opusResult=opus_解码(opusDecoder,voicePacketBuffer,voicePacketLength,pcm,9600,0)
  • 将其保存到文件:
    pcmFile.write(pcm,opusResult*sizeof(opus_int16))
  • 使用(文件>导入>原始数据…)读取文件
  • 问题来了:有时它工作得非常好(我可以听到解码后的PCM音频,没有小故障,并且速度与原始速度相同)但有时,解码后的音频流处于“慢动作”(有时比正常速度稍慢,有时慢得多)

    我不知道为什么,因为我没有改变我的程序:解码设置保持不变。然而,有时有效,有时无效。另外,
    opus\u decode()
    始终能够解码数据,它不会返回错误代码

    我读到解码器有一个“状态”()。我想也许调用opus\u decode()之间的时间间隔很重要

    您能想到任何可能导致这种影响的参数,无论是显式参数(如给定给函数的参数)还是隐式参数(两次函数调用之间的时间)?

    “慢动作”音频几乎总是采样率不匹配(以高速率录制,但以低速率播放)。例如,如果您以48kHz的频率录制音频,但以8kHz的频率播放

    “慢动作”的另一个可能原因是由同一解码器解码的多个流。但在这种情况下,你也会得到失真的慢速音频

    至于作品:

    • 它总是按照您在创建参数中指定的速率进行解码
    • 在它里面有纯数学(没有任何定时器或实时相关的东西),所以当您调用decode函数时它并不重要
    因此,一些故障排除建议:

    • 请确保您没有创建具有不同采样率的解码器
    • 确保在audacity中导入原始文件时,始终以48kHz mono格式导入
    • 如果以上任何一项都没有帮助-检查在正常/慢动作情况下每个数据包上从解码器接收的字节数。对于正常音频流(具有统一的数据包间时间),您始终可以获得相同数量的原始音频样本

    我没有使用OPUS解码器的经验,但听到“慢动作”声音可能意味着您无法以录制的速度播放。这是否意味着音频流可以不时具有不同的采样率?你确定总是48000吗?