采样率改变后声音失真

Posted

技术标签:

【中文标题】采样率改变后声音失真【英文标题】:Distorted sound after sample rate change 【发布时间】:2012-11-11 16:58:22 【问题描述】:

这个让我保持清醒: 我有一个 OS X 音频应用程序,如果用户更改设备的当前采样率,它必须做出反应。 为此,我在“kAudioDevicePropertyNominalSampleRate”上为输入和输出设备注册了一个回调。 因此,如果其中一个设备的采样率发生变化,我会收到回调并在设备上设置新的采样率,并使用“AudioObjectSetPropertyData”和“kAudioDevicePropertyNominalSampleRate”作为选择器。 苹果邮件列表中提到了接下来的步骤,我遵循了它们:

停止输入 AudioUnit 和由混音器和输出 AudioUnit 组成的 AUGraph 将它们都取消初始化。 检查节点数,跳过它们并使用 AUGraphDisconnectNodeInput 断开混音器与输出的连接 现在在输入单元的输出范围上设置新的采样率 以及混音器单元的输入和输出范围 将混音器节点重新连接到输出单元 更新图表 初始化输入和图形 开始输入和图表

渲染和输出回调重新开始,但现在音频失真了。我相信是输入渲染回调负责信号,但我不确定。 我忘记了什么? 据我所知,采样率不会影响缓冲区大小。 如果我以其他采样率启动我的应用程序,一切正常,这是导致信号失真的变化。 我看前后的流格式(kAudioUnitProperty_StreamFormat)。一切都保持不变,除了采样率当然会更改为新值。

正如我所说,我认为需要更改的是输入渲染回调。我是否必须通知回调需要更多样本?我检查了 44k 和 48k 的回调和缓冲区大小,没有什么不同。

我写了一个小测试应用,如果你想让我提供代码,我可以给你看。

编辑:我录制了失真的音频(正弦波)并在 Audacity 中查看。 我发现,每 495 个样本后,音频会下降 17 个样本。 我想你知道这是怎么回事:495 个样本 + 17 个样本 = 512 个样本。这是我设备的缓冲区大小。 但我仍然不知道我能用这个发现做什么。 我检查了我的输入和输出渲染过程及其对 RingBuffer 的访问(我使用的是固定版本的 CARingBuffer) 存储和获取 512 帧,所以这里什么都没有......

【问题讨论】:

【参考方案1】:

知道了! 断开图表后,似乎有必要告诉两个设备新的采样率。 我在回调之前已经这样做了,但似乎这必须在以后完成。

【讨论】:

以上是关于采样率改变后声音失真的主要内容,如果未能解决你的问题,请参考以下文章

采样率改变正弦波的音高,sound() 函数,MATLAB

音频中采样位数,采样率,比特率的名词解释(转)

音频 属性详解(涉及采样率通道数位数比特率帧等)

如何在 Java 中以给定的采样率播放声音?

融云分析基于 ffmpeg 实现重采样和混音

采样率转换功能无法产生可听见的声音,但只能产生一小段音频