解码 OPUS 音频流时的慢动作效果
Slow motion effect when decoding OPUS audio stream
我正在捕获用 OPUS Codec, and I want to decode it into raw PCM audio (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 音频,没有故障,而且速度是原来的速度)但有时,解码后的音频流是“慢动作”(有时比正常慢一点,有时慢很多)。
我找不到原因,因为我没有更改我的程序:解码设置保持不变。然而,有时它有效,有时却无效。此外,opus_decode()
始终能够解码数据,它不会 return 错误代码。
我读到解码器有一个“状态”(opus_decoder_ctl() doc)。我想也许 opus_decode()
次通话之间的时间很重要?
你能想到任何参数,无论是显式的(比如给函数的参数)还是隐式的(两次函数调用之间的时间),都可能导致这种效果?
"Slow motion" 音频几乎总是采样率不匹配(以高速率录制但以低速率播放)。例如,如果您以 48kHz 录制音频但以 8kHz 播放。
"slow motion" 的另一个可能原因是同一解码器解码了多个流。但在这种情况下,您还会听到失真的慢速音频。
至于OPUS:
- 它始终以您在创建参数中指定的速率解码。
- 它里面有纯数学(没有任何定时器或实时相关的东西)所以当你调用解码函数时它并不重要。
因此一些故障排除建议:
- 确保您没有创建具有不同采样率的解码器
- 确保在 audacity 中导入原始文件时始终以 48kHz 单声道导入它
- 如果上述任何一项都没有帮助 - 检查在 normal/slow 运动情况下每个数据包从解码器接收到多少字节。对于普通音频流(具有统一的数据包间时间),您始终会获得相同数量的原始音频样本。
我正在捕获用 OPUS Codec, and I want to decode it into raw PCM audio (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 音频,没有故障,而且速度是原来的速度)但有时,解码后的音频流是“慢动作”(有时比正常慢一点,有时慢很多)。
我找不到原因,因为我没有更改我的程序:解码设置保持不变。然而,有时它有效,有时却无效。此外,opus_decode()
始终能够解码数据,它不会 return 错误代码。
我读到解码器有一个“状态”(opus_decoder_ctl() doc)。我想也许 opus_decode()
次通话之间的时间很重要?
你能想到任何参数,无论是显式的(比如给函数的参数)还是隐式的(两次函数调用之间的时间),都可能导致这种效果?
"Slow motion" 音频几乎总是采样率不匹配(以高速率录制但以低速率播放)。例如,如果您以 48kHz 录制音频但以 8kHz 播放。
"slow motion" 的另一个可能原因是同一解码器解码了多个流。但在这种情况下,您还会听到失真的慢速音频。
至于OPUS:
- 它始终以您在创建参数中指定的速率解码。
- 它里面有纯数学(没有任何定时器或实时相关的东西)所以当你调用解码函数时它并不重要。
因此一些故障排除建议:
- 确保您没有创建具有不同采样率的解码器
- 确保在 audacity 中导入原始文件时始终以 48kHz 单声道导入它
- 如果上述任何一项都没有帮助 - 检查在 normal/slow 运动情况下每个数据包从解码器接收到多少字节。对于普通音频流(具有统一的数据包间时间),您始终会获得相同数量的原始音频样本。