【问题标题】:Real-Time Audio Loop Switching for iPhoneiPhone 的实时音频循环切换
【发布时间】:2011-02-15 19:43:05
【问题描述】:

我正在尝试找到播放无缝音频循环的最佳方式,用户可以在最短的时间内切换到另一个音频,并提供相当数量 (30-150) 的非常短的循环。 OpenAL 是否足以满足此要求,还是我需要深入研究音频单元? Apple 文档说,对于像乐器这样的实时反馈,Audio Units 是正确的选择。

我只是想获得社区对此的意见,任何链接和示例项目都将不胜感激。

【问题讨论】:

    标签: iphone core-audio openal audiounit


    【解决方案1】:

    您可以使用AVAudioPlayer 无缝循环压缩音频文件 (numberOfLoops = -1)。我建议使用 IMA4 编码的 CAF 文件,因为据传这些文件可以从硬件解压缩中受益(为其他事情节省 CPU 周期)。

    要减小文件大小,您可以降低比特率(尝试 96 kbps)和/或使用单声道。

    请注意,AVAudioPlayer 不允许您更改播放的速度或频率。

    【讨论】:

    • 更多关于 OpenAL 与音频单元的信息:stackoverflow.com/questions/1002838/audio-on-the-iphone
    • 我最初怀疑这是否能让我无缝拼接不同的样本,但使用它的各种 NSTimeInterval 命令(当前时间、总持续时间)我应该能够弄清楚我需要知道什么.非常感谢,祝我好运!
    • 祝你好运。这就是我在 Hexaphone 中管理无缝循环/循环切换的方式——我使用 NSTimer (scheduledTimerWithTimeInterval) 来“遮蔽” AVAudioPlayer(对于更新可见节拍指示器也很有用),因为 AVAudioPlayerDelegate 事件的速度不足以满足我的需要。
    • 也许“无缝”是主观的。在我的应用程序(Hexaphone)中,背景鼓循环使用 AVAudioPlayer,并且循环在我耳边是无缝的。在代码级别,它在一两毫秒内是无缝的。也许您使用的文件编码在硬件上性能不佳?
    • !你知道吗,在最新版本中,事实上你是完全正确的。 AVAudioPlayer 臭名昭著的“差距”问题得到了极大的改善,即使不是大多数情况,也可能在许多情况下消除。你10000%正确,我错了。我没有意识到它已经改进了这么多。谢谢你的提示!太棒了。
    【解决方案2】:

    这可能并不能真正回答您的问题,但您是否看过Finch? 仅查看源代码可能会提供一些指示。

    • 约翰内斯

    【讨论】:

    • 这是一个非常令人兴奋的易于实现的声音应用程序,但不幸的是,我没有看到任何关于检测样本结尾的内容,或者任何其他可以让循环变得容易的内容。
    【解决方案3】:

    如果您需要能够在没有播放延迟的情况下切换到另一个音频样本,则需要使用 OpenAL。 AVAudioPlayer 在开始播放之前有一个延迟。

    您可以通过调用 prepareToPlay 来最大限度地减少延迟,但它并不总是能完全消除延迟。同样,如果您有 30 到 150 个用户选择播放的样本,您不会事先知道需要预加载哪些样本。

    以下是 OpenAL 和 AVAudioPlayer 之间优缺点的简要说明:http://kstenerud.github.com/ObjectAL-for-iPhone/documentation/index.html#choosing_sec

    【讨论】:

    • 如果样本足够小,我想我可以预加载所有样本。你知道缓存大小吗?
    • OpenAL 中的样本必须是未压缩的 PCM,16 位(技术上允许 8 位,但我从未让它在 iPhone 上工作)。因此,如果它们不是那种格式,您将不得不将它们存储为未压缩或在加载时解压缩。只要您有足够的空闲内存来加载所有内容,就可以了。基于 arm6 的旧 iOS 设备(如 iPhone 3g)的应用程序的总 RAM 限制约为 24MB。之后,您将面临被操作系统关闭的风险。使用更新的设备,您可以使用更多的 RAM。
    • 如果您还在考虑 AVAudioPlayer,还有一件事:我认为您不能拥有 30-150 个预加载音频的 AVAudioPlayer。请注意,我实际上并没有尝试过,但这不是 AVAudioPlayer 的设计目的。
    • 我对 looped 样本的 OpenAL 的问题是我无法在没有听到爆音的情况下停止播放。
    【解决方案4】:

    我最终为此使用了 Cocos2D 的音频库,它的性能比我预期的要好得多。 AVAudioPlayer 最终比我需要的低了一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      • 2019-06-20
      • 1970-01-01
      相关资源
      最近更新 更多