IOS 8:实时声音处理和声音投球 - OpenAL或其他框架

时间:2015-02-17 20:44:46

标签: ios xcode audio real-time openal

我试图实现一个在循环中播放一系列音调的应用。 实际上,我使用的是OpenAL,我对这种框架的体验是积极的,因为我也可以进行合理的音调。

以下是该方案:

  1. 从CAF文件加载短音(3秒)
  2. 在循环中播放该声音并执行声音移位。
  3. 这很有效,只要节拍率不高 - 我的意思是每个音调的时间超过10毫秒。

    无论如何,我的NSTimer(将我的声音序列嵌入播放)应该是可配置的 - 一旦我的节拍率增加(我的意思是每个音调小于10毫秒),声音就不再正确回声 - 即使是一些音调也是如此以明显的随机方式丢弃。

    似乎实时声音处理成为一个问题。 我仍然是IOS编程的新手,但我相信Apple设定了时间消耗和/或信号量的限制。

    现在我的问题:

    1. OpenAL是用C语言编写的 - 直到现在,我还没有理解该框架背后的整个代码和哲学。是否有可能解决我上面提到的问题进行一些修改 - 我的意思是设置标志/值或覆盖某些方法?
    2. 如果没有,你知道另一个更适合这种实时声音处理的IOS声音框架吗?
    3. 非常感谢提前! 我知道它涉及一个相当特殊和困难的问题 - 也许是s.o.你解决了类似的问题?只是要强调:声音音调必须得到保证!

1 个答案:

答案 0 :(得分:0)

从解释中不能立即清楚地知道你正在努力实现的目标。预计会有一些代码。

但是,使用NSTimer对音频播放进行排序显然存在问题。它既不是可靠的也不是高分辨率计时器。

  • NSTimer通过运行循环队列(可能是您的应用程序的主队列)传递事件 - 它们满足用户界面事件。
  • 由于主线程不是实时线程,因此甚至可能无法安排运行一段时间。
  • 您请求的延迟可能会产生量化效果,这意味着您的事件有效地舍入到零时钟滴答并立即安排。
  • Perioidic计时器对电池寿命有不利影响。 iOS和MacOSX都采取措施减少timer coalescing
  • 的影响

您应该用于排序事件的时钟是回放采样时钟 - 可以在您使用的任何框架的渲染处理程序中使用。除了可靠之外,这也是有效的,因为渲染处理程序无论如何都会定期运行,并且在实时线程中。