重用 AVAudioPlayer 以获得不同的声音

Posted

技术标签:

【中文标题】重用 AVAudioPlayer 以获得不同的声音【英文标题】:Reusing an AVAudioPlayer for a different sound 【发布时间】:2011-06-23 09:37:33 【问题描述】:

我有一个可以播放多种声音的 AVAudioPlayer 实例。有没有办法为 AVAudioPlayer 实例提供新声音,还是我必须使用 initWithData: 创建一个新实例?

【问题讨论】:

【参考方案1】:

没有 API 可以将新文件传递给现有的 AVAudioPlayer 实例。但是,创建 AVAudioPlayer 并不昂贵,因此您不必担心性能,只要在完成实例后发布实例即可。

如果您有一组固定的相互播放或可能重复播放的声音,您可以为每个声音创建一个 AVAudioPlayer 实例,并通过在适当的实例上调用 play 来重复使用这些实例。

如果一次只播放一种声音,并且您正在生成新声音(例如基于用户输入的文本转语音),我通常将单个播放器作为属性。当播放新声音时,我调用[player stop],释放旧播放器,并使用新声音文件实例化一个新播放器。

【讨论】:

是的,我在谷歌上搜索过这个问题,因为我认为制作很多新的 AVAudioPlayer 会导致性能下降。你的回答一下子解决了我的问题。 1) 无法在 AVAudioPlayer 中修改文件 2) 创建 AVAudioPlayer 并不昂贵。 ARC下有什么建议吗?【参考方案2】:

重用对象通常是一个坏主意,通常尽量让你的对象寿命尽可能短。这减少了代码可能状态的数量,并使推理更容易。 (“这个值是从哪里来的?也许它是之前实例使用的剩余部分?”糟糕。)只有在遇到可衡量的问题时才打破这条规则。

如需进一步阅读此思路,您可以浏览questions tagged “immutable”。

【讨论】:

这不是对@Fernando 问题的回答,而是过度概括。在许多情况下,对象重用是比创建新对象更好的方法。 我认为克里斯托弗是对的。这是出于性能原因。例如,表格视图重用现有单元格,Apple 明确鼓励这样做。至少你已经回答了张贴者的问题,“无法更改文件”,就像 Christopher 所做的那样。 表格视图是一种特殊情况,因为它必须满足硬性能要求(滚动)。但总的来说,今天新对象构造的性能成本相当低,我坚持这样一种说法,即在遇到性能问题之前重用对象是个坏主意。

以上是关于重用 AVAudioPlayer 以获得不同的声音的主要内容,如果未能解决你的问题,请参考以下文章

使用 AVAudioPlayer 播放声音时出现问题?

触发 AVAudioPlayer 以停止所有声音并播放选定的声音,除非单击播放(选定)按钮

AVAudioPlayer 在进行 WebRTC 音频通话时以非常低的音量播放声音

每个单独的声音都需要一个 AVAudioPlayer 实例吗?

ios开发之--AVAudioPlayer制作了一款播放器,耳机有声音,扬声器没声音

(iphone) 如何使用 AVAudioPlayer 顺序播放声音?