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

时间:2018-05-01 12:26:18

标签: c++ opus

我正在捕捉语音聊天程序的音频流(它是专有的,闭源的,我无法控制它),它是用OPUS Codec编码的,我想解码它到原始PCM音频(Opus Decoder doc)。

我正在做的是:

  1. 创建OPUS解码器:var r = new AuthorRequest { Name = "William", Surname = "Shakespeare", Books = new BookRequest[] { new BookRequest { Title = "Macbeth" }, new BookRequest { Title = "Romeo and Juliet" }, }, }; r.Adapt<Author>().Dump();
  2. 解码流:opusDecoder = opus_decoder_create(48000, 1, &opusResult);
  3. 将其保存到文件:opusResult = opus_decode(opusDecoder, voicePacketBuffer, voicePacketLength, pcm, 9600, 0);
  4. 使用Audacity文件&gt;导入&gt;原始数据... )阅读文件
  5. 问题出现了:有时它运行得非常好(我可以听到解码的PCM音频没有毛刺和原始速度)但有时,解码后的音频流是在&#34; 慢动作&#34; (有时比正常慢一点,有时慢得多)。

    我无法找到原因,因为我不会改变我的程序:解码设置保持不变。然而,有时它有效,有时它不会。此外,pcmFile.write(pcm, opusResult * sizeof(opus_int16));始终能够解码数据,它不会返回错误代码。

    我读到解码器有一个&#34; 状态&#34; (opus_decoder_ctl() doc)。我想也许opus_decode()次来电之间的时间很重要?

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

1 个答案:

答案 0 :(得分:2)

&#34;慢动作&#34;音频几乎总是不匹配采样率(以高速率录制但以低速率播放)。例如,如果您在48kHz上录制音频,但将其播放为8kHz。

慢动作的另一个可能原因&#34;是由同一解码器解码的多个流。但在这种情况下,你也会得到扭曲的慢音频。

至于OPUS:

  • 它始终按照您在create parameters中指定的速率进行解码。
  • 里面有纯数学(没有任何计时器或实时相关的东西)所以当你调用解码函数时它并不重要。

因此,一些故障排除建议:

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