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

2024-01-17

我正在捕获语音聊天程序的音频流(它是专有的、闭源的,我无法控制它),该音频流是用OPUS编解码器 http://opus-codec.org/,我想将其解码为原始 PCM 音频(Opus 解码器文档 http://opus-codec.org/docs/opus_api-1.2/group__opus__decoder.html#ga7d1111f64c36027ddcb81799df9b3fc9).

我正在做的是:

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

问题来了:有时它工作得很好(我可以听到解码的 PCM 音频,没有故障,并且具有原始速度)但是有时,解码后的音频流位于“慢动作“(有时比正常慢一点,有时慢很多)。

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

我读到解码器有一个“state" (opus_decoder_ctl() 文档 https://mf4.xiph.org/jenkins/view/opus/job/opus/ws/doc/html/group__opus__decoder.html#ga2d492844b4f66e7f34d85870f13d4846)。我想也许时间间隔opus_decode()通话重要吗?

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


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

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

至于OPUS:

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

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

  • 确保您没有创建具有不同采样率的解码器
  • 确保当您在 audacity 中导入原始文件时,您始终以 48kHz 单声道导入它
  • 如果上述任何内容都没有帮助 - 检查在正常/慢动作情况下从每个数据包的解码器接收到的字节数。对于普通音频流(具有统一的数据包间时间),您始终获得相同数量的原始音频样本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解码 OPUS 音频流时的慢动作效果 的相关文章

随机推荐