【问题标题】:Slow motion effect when decoding OPUS audio stream解码 OPUS 音频流时的慢动作效果
【发布时间】:2018-10-11 11:44:48
【问题描述】:

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

我正在做的是:

  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 读取文件(文件 > 导入 > 原始数据...

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

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

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

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

【问题讨论】:

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

标签: c++ opus


【解决方案1】:

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

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

至于 OPUS:

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

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

  • 确保不要创建具有不同采样率的解码器
  • 确保在大胆导入原始文件时始终以 48kHz 单声道导入它
  • 如果上述任何方法不起作用 - 检查在正常/慢动作情况下每个数据包从解码器接收到的字节数。对于普通音频流(具有统一的数据包间时间),您始终会获得相同数量的原始音频样本。

【讨论】:

    猜你喜欢
    • 2013-05-05
    • 2012-11-19
    • 1970-01-01
    • 2020-09-24
    • 2015-08-07
    • 2016-10-25
    • 2013-02-06
    • 2020-01-07
    • 1970-01-01
    相关资源
    最近更新 更多