【问题标题】:Best way to play different sounds one at a time on iphone?在 iPhone 上一次播放不同声音的最佳方法是什么?
【发布时间】:2023-12-04 08:34:02
【问题描述】:

我有很多想要播放的声音。现在我正在使用 AVAudioPlayer。当用户点击一个按钮时,一个新的声音应该开始。 AVAudioPlayer 的 url 属性是只读的。我宁愿不必每次想要播放新声音时都释放并重新分配对象。最好的方法是什么?我需要使用不同的类吗?

【问题讨论】:

  • 我正在考虑只制作一组 AVAudioPlayers,每个声音一个,但这似乎有点矫枉过正。

标签: iphone ios core-audio avaudioplayer


【解决方案1】:

播放声音最简单的方法是Playing UI Sound Effects or Invoking Vibration Using System Sound Services。本质上,您调用 AudioServicesCreateSystemSoundID() 和 AudioServicesPlaySystemSound()。创建系统声音相对昂贵,并且在使用 AudioServicesDisposeSystemSoundID() 处理时播放停止,所以你真的想缓存它们:

  • 在应用启动时创建它们(或者可能是第一次播放声音时)。您可以将它们保存在以声音文件名为键的 NSDictionary 中,并将声音 ID 存储在 NSValue 中,等等。
  • 如果您不放心,请在您的应用退出、进入后台或出现内存警告时处理它们。

最大的警告是“系统声音”仅支持少数几种声音格式;苹果似乎推荐 IMA4(afconvert -f caff -d ima4 input.file output.caf 和可选的-c 1,如果您对单声道感到满意)。

也就是说,只要您不介意一次播放一个声音,它非常适合播放短声音(如果您在播放声音时播放声音,它会重新开始播放)。我怀疑它也是由内核直接播放的(您可以设置一个标志以使其在您的应用程序退出时继续播放),这可能意味着它在 CPU 方面的效率更高。它可能与 AVAudioPlayer 播放的声音混合。

【讨论】:

  • 我对此的自发反应是,嗯...我认为 Apple 只是未能实现“简单的事情应该简单,复杂的事情应该成为可能”的好习惯。但也许下面有通用的波缓冲+混频器解决方案?
  • @Henrik Erlandsson,当然,但虽然音频在概念上可能很简单,但高性能音频 API 往往相当复杂,尤其是当您需要处理硬件编解码器时。让内核播放 PCM 或简单压缩的音频似乎非常明智,而且开销应该很小,而我不想要内核内的 MP3 解码器。
最近更新 更多