【问题标题】:Audio on the iPhoneiPhone 上的音频
【发布时间】:2010-11-03 10:08:02
【问题描述】:

我正在寻找创建一个模拟物理仪器的应用程序。我有音频样本,但我希望能够动态增加音高/频率,这样我就不必从太多文件中加载。

知道哪个音频 API 能够做到这一点吗?我认为是 OpenAL 或音频队列服务,但不确定哪个合适。任何指向指南/示例代码的链接也非常感谢。

提前致谢。

【问题讨论】:

    标签: iphone audio


    【解决方案1】:

    我在 2009 年沿着这条路走下去,尝试了 Audio Toolkit、Audio Queue Services、openAL,最后选择了 RemoteIO AudioUnit。

    Audio Toolbox 适用于基本的触发音效,但无法更改频率或循环采样。

    音频队列服务可以循环采样,但我能找到调整采样播放频率的唯一方法是从文件中重新读取数据——非常痛苦。此外,该框架非常繁琐 - 我只会在尝试从 Internet 上传输某些内容时使用它。

    OpenAL 真是天赐之物——在我接触到 Apple 不再提供的“CrashLanding”iPhone 示例应用程序后,不到一个小时就启动并运行了它。我发现 OpenAL 非常适合游戏甚至乐器——可以预先加载样本,调整频率很容易,循环也没有问题。对我来说最重要的是,开始和停止循环采样 几乎每次都会导致令人讨厌的“弹出”。此外,内置的 3d 位置音频混音器对我来说有点太占用 CPU 了。

    如果您的仪器不使用循环样本,我建议先尝试 OpenAL 路线 - 学习曲线不那么令人生畏。尝试追踪“SoundEngine.h”、“CrashLanding”或“TouchFighter”,或查看以下链接:

    http://benbritten.com/blog/2008/11/06/openal-sound-on-the-iphone/

    由于循环采样是我的要求,我最终选择了 AudioUnits(在 iPhone 上,如果你想做输入或输出,它被称为“RemoteIO”)。实现起来非常困难 - 与音频队列服务非常相似,因为您实现的核心将位于“缓冲区回调”中,每秒被调用多次以使用原始 SInt16 值填充出站音频缓冲区。

    最终,我的乐器在多音符复音、循环采样、无爆音和最小延迟方面表现出色。

    不幸的是,RemoteIO 没有很好的文档记录。 Michael Tyson 是该领域最早详细撰写 RemoteIO 的人之一,他的帖子(和 cmets)对我非常有用:

    http://michael.tyson.id.au/2008/11/04/using-remoteio-audio-unit/

    祝你好运!

    多年后编辑:我已经开源了上面提到的 RemoteIO/AudioUnits 代码:https://github.com/glenn-barnett/hexaphone/blob/master/Classes/Instrument.m - 为混乱道歉,我希望有时间清理代码和 cmets。

    【讨论】:

    • 感谢您的提示。我目前正在使用 oalTouch 示例代码尝试 OpenAL,但我找不到动态更改音高或频率的设置。非常感谢任何正确方向的提示!
    • 没关系。我发现了如何调整音高。 oalTouch的示例代码只管理一个声音文件,所以我想我还是需要看看soundManager。
    • soundEngine 代码在 iPhone OS 2.21 SDK 上运行良好,但无法在 SDK 3.0 上编译。知道是否有新版本吗?
    • 您的意思是“音频工具包”还是“音频工具箱”? AudioToolbox.framework 是 Core Audio 的一部分。
    • @AlexChaffee 哎呀,我的意思是“音频工具箱”。将进行编辑。
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      尝试创建一个音频单元。我正在做类似的事情,一个 AU 对我来说效果很好。 最初我使用了一个音频队列,因为它更简单(更高级别?)和 同步的,但是它缺乏响应能力,所以我把它扔了 音频单元。

      【讨论】:

        【解决方案4】:

        听起来,有点像你在创建播放 MIDI 文件的波表合成方法。您可能能够找到一个您可以使用的 iPhone MIDI 合成器,然后使用您的音频样本来构建波表集。任何时候您想要播放音调,您只需将 MIDI 事件与您加载的波表集一起发送到 iPhone MIDI 合成器。

        【讨论】:

        • 技术性太强了(我是一个合成书呆子),它听起来更像是一个简单的采样乐器,而不是波表合成。我都做过。 en.wikipedia.org/wiki/Wavetable_synthesis
        • 我不是合成书呆子,我对声音编程的经验很少;我只是写了答案,因为我认为我从我的一般计算机知识体系中看到了相似之处,并且在我写我的时候没有发布答案,所以我想我会投入两分钱。我很高兴在这方面有更多经验的人比我发布更好的答案:)
        • 我并没有投票给你或其他任何事情,只是想指出波表合成器有多酷。 :-)
        • @Nosredna - 没想到你在攻击;实际上很高兴你写了那条评论并把我指向了维基百科;你说得对,波表!= 采样乐器。
        猜你喜欢
        • 2012-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-26
        相关资源
        最近更新 更多