解码 OPUS 音频流时的慢动作效果
Slow motion effect when decoding OPUS audio stream
我正在捕获语音聊天程序的音频流(它是专有的,闭源的,我无法控制它(,该程序是用OPUS编解码器编码的,我想将其解码为原始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));
- 大胆地读取文件(文件>导入原始数据>...
问题来了:有时它运行良好(我可以听到解码的 PCM 音频没有故障和原始速度(,但有时,解码的音频流是">慢动作"(有时比正常慢一点,有时慢得多(。
我找不到原因,因为我不更改我的程序:解码设置保持不变。然而,有时它有效,有时它不起作用。此外,opus_decode()
始终能够解码数据,但它不会返回错误代码。
我读到解码器有一个">状态"(opus_decoder_ctl(( doc(。我想也许opus_decode()
通话之间的时间很重要?
你能想到任何可能导致这种效果的参数吗,无论是显式的(如提供给函数的参数(还是隐式的(两次函数调用之间的时间(,都可能导致这种效果?
">
慢动作"音频几乎总是采样率不匹配(以高速率录制,但以低速率播放(。例如,如果您以 48kHz 录制音频,但以 8kHz 播放。
"慢动作"的另一个可能原因是同一个解码器解码了多个流。但在这种情况下,您也会出现失真的慢速音频。
至于作品:
- 它始终以您在创建参数中指定的速率进行解码。
- 它里面有纯数学(没有任何计时器或实时相关的东西(,所以当你调用解码函数时并不重要。
因此,一些故障排除建议:
- 确保不要创建具有不同采样率的解码器
- 确保在大胆导入原始文件时始终以 48kHz 单声道导入
- 如果上述任何一项没有帮助 - 检查在正常/慢动作情况下,您从每个数据包的解码器接收了多少字节。对于普通音频流(具有统一的数据包间时间(,您始终获得相同数量的原始音频样本。
相关文章:
- 从udp接收帧对于人脸识别来说太慢
- Boost Spirit,获取迭代器内部语义动作
- OpenGL大的3D纹理(>2GB)非常慢
- 为什么std::vector比数组慢
- 为什么一个向量上的多线程操作很慢
- 多线程比没有线程C++慢
- 为什么C++正则表达式这么慢?
- 为什么平均打印数组元素比打印单个对象慢C++?
- 为什么在此排序算法实现中,向量明显比数组慢?
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++数组与向量排序(在我的情况下,向量比数组慢~2.5倍(无优化))
- 为什么 SDL 在 Mac 上比 Linux 慢得多?
- VS 2017 和 2019 运行 c++ 真的很慢
- 我的自定义使用 std::unordered_map 的性能非常慢
- 为什么矩阵加法比特征中的矩阵-向量乘法慢?
- 为什么 std::count 比 MSVC 编译器的普通循环慢,但与 GCC 相等?
- 为什么循环体中的一个基本算术运算执行得比两个算术运算慢
- 使用 at() 访问 std::map 元素是否比运算符 [] 慢?
- C++二进制文件 I/O 操作速度变慢.数据库如何处理二进制文件?
- 解码 OPUS 音频流时的慢动作效果