iPhone 的实时音频循环切换
Posted
技术标签:
【中文标题】iPhone 的实时音频循环切换【英文标题】:Real-Time Audio Loop Switching for iPhone 【发布时间】:2011-02-15 19:43:05 【问题描述】:我正在尝试找到播放无缝音频循环的最佳方式,用户可以在最短的时间内切换到另一个音频,并提供相当数量 (30-150) 的非常短的循环。 OpenAL 是否足以满足此要求,还是我需要深入研究音频单元? Apple 文档说,对于像乐器这样的实时反馈,Audio Units 是正确的选择。
我只是想获得社区对此的意见,任何链接和示例项目都将不胜感激。
【问题讨论】:
【参考方案1】:您可以使用AVAudioPlayer 无缝循环压缩音频文件 (numberOfLoops = -1)。我建议使用 IMA4 编码的 CAF 文件,因为据传这些文件可以从硬件解压缩中受益(为其他事情节省 CPU 周期)。
要减小文件大小,您可以降低比特率(尝试 96 kbps)和/或使用单声道。
请注意,AVAudioPlayer 不允许您更改播放的速度或频率。
【讨论】:
更多关于 OpenAL 与音频单元的信息:***.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 最终比我需要的低了一点。
【讨论】:
以上是关于iPhone 的实时音频循环切换的主要内容,如果未能解决你的问题,请参考以下文章