ios - 采样率更改后声音失真

标签 ios macos audio core-audio sample-rate

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

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

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

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

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

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

最佳答案

明白了!
断开图形后,似乎有必要告诉两个设备新的采样率。
我已经在回调之前完成了此操作,但似乎必须在以后完成。

关于ios - 采样率更改后声音失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13527195/

相关文章:

audio - 带有元数据支持标签的音频文件格式?

java - Android MediaPlayer无法正确播放音频

iphone - 什么时候写“NSString * str”或“NSString str”?

ios - 有没有办法在 Windows 上构建 IOS Unity 构建

xcode - 从两个应用程序创建一个 "Universal Binary"?

macos - 检测 Shift 键的 NSKeyUp

ios - CPTBarPlot - barTip 和 barBase 属性

ios - 如何为 UISearchBar 抓取颜色?

c - 在 mac os 10.11 上运行 valgrind 会产生错误

javascript - SoundManager2 在 Android 上同时播放多个声音