我正在捕获使用OPUS Codec编码的语音聊天程序(它是专有的,封闭源代码,并且我无法控制)的音频流,并且我想将其解码为原始PCM音频(Opus Decoder doc)。

我正在做的是:

  • 创建OPUS解码器:opusDecoder = opus_decoder_create(48000, 1, &opusResult);
  • 解码流:opusResult = opus_decode(opusDecoder, voicePacketBuffer, voicePacketLength, pcm, 9600, 0);
  • 将其保存到文件中:pcmFile.write(pcm, opusResult * sizeof(opus_int16));
  • 使用Audacity读取文件(文件>导入>原始数据...)

  • 问题来了:有时是,它工作得很好(我可以听到解码的PCM音频而不会出现毛刺,并且保持原始速度),但有时是,解码后的音频流位于“慢 Action ”(有时慢一点)比正常情况下,有时要慢得多)。

    我找不到原因,因为我不更改程序:解码设置保持不变。然而,有时它起作用,有时却不起作用。同样,opus_decode()总是能够解码数据,它不返回错误代码。

    我读到解码器有一个“状态”(opus_decoder_ctl() doc)。我以为opus_decode()调用之间的时间可能很重要?

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

    最佳答案

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

    “慢 Action ”的另一可能原因是由同一解码器解码的流不止一个。但是在这种情况下,您还会听到失真的慢音频。

    至于OPUS:

  • 始终以您在create参数中指定的速率解码。
  • 里面有纯数学运算(没有任何计时器或与实时相关的东西),因此在调用解码函数时并不重要。

  • 因此,一些故障排除建议:
  • 确保您不创建具有不同采样率的解码器
  • 确保以大胆性导入原始文件时,始终以48kHz单声道
  • 导入
  • 如果上述任何方法均无济于事-在正常/慢 Action 情况下,检查每个数据包从解码器接收的字节数。对于普通音频流(具有均匀的数据包间时间),您始终会获得相同数量的原始音频样本。
  • 10-04 15:10
    查看更多