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

Posted

技术标签:

【中文标题】每个单独的声音都需要一个 AVAudioPlayer 实例吗?【英文标题】:Does each individual sound require an instance of AVAudioPlayer? 【发布时间】:2011-12-25 19:06:13 【问题描述】:

我有一些游戏声音,例如四种不同的哔声,每种声音的播放取决于用户执行的操作。我需要实例化四个不同的AVAudioPlayer 对象吗?

或者我只需要一名主要球员?如果我只需要一个,那么如何切换文件 URL?

这就是我现在正在做的事情:

NSError *error;
soundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:markedSound error:&error];

但初始化似乎需要几秒钟。有没有办法预加载文件并在它们之间快速切换?

【问题讨论】:

【参考方案1】:

继续创建尽可能多的实例。 初始化后,使用prepareToPlay的方法:

通过预加载缓冲区来准备播放音频播放器。 讨论 调用此方法预加载缓冲区并获取音频 播放所需的硬件,最大限度地减少调用之间的延迟 play 方法和声音输出的开始。

调用stop 方法,或让声音完成播放,撤消 这个设置。

例如:

NSError *error;
soundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:markedSound error:&error];
[soundPlayer prepareToPlay];

目前,您只需要 4 首歌曲,因此这将是过早的优化。但是如果以后你需要的声音数量增加很多,你可以将所有这些都包装在一个子类中并进行延迟加载。正如文档所述,使用 stop 方法相当于卸载文件。

【讨论】:

【参考方案2】:

您不一定需要实例化四个不同的 AVAudioPlayer 对象,尽管这是一种选择(如果您只有有四个声音,这可能是最简单的)。

您可以提前将声音加载到内存中,这可以通过使用initWithData 方法而不是initWithContentsOfURL 来完成(预先将所有声音文件加载到NSData 对象) .这可能会稍微加快速度,尽管它也取决于您的声音格式。例如,未压缩文件的加载速度显然比 MP3 快得多。

如果这仍然不适合您,最好的办法是查看提供的一些较低级别的音频技术,这些技术更适合游戏工作(OpenAL、Audio Toolbox 等),但这些是比简单的AVVAudioPlayer 复杂一点。

【讨论】:

解决方案不是最佳的。我没有检查过,但如果大部分延迟来自 AVAudioPlayer 的工作(解压缩......)而不是文件加载,我不会感到惊讶。低杠杆解决方案可能很棒,但在这种情况下有点矫枉过正。 好吧,就像我说的,如果你使用未压缩的文件会快很多。

以上是关于每个单独的声音都需要一个 AVAudioPlayer 实例吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何从内存中播放 Wav 声音样本

ROBLOX 中本地玩家的声音脚本

Qt:如何在不阻塞主线程的情况下播放声音?

三星手机无法录制声音显示另一个应用程序正在使用麦克风怎么办?

ruby 表单有效,但每个“Job_Value”都需要自己单独的记录。一个用于选择的属性,或一组选择,或包含在两者中

ios - 混合 MIDI 文件,每个文件都有自己的声音字体