每个单独的声音都需要一个 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 实例吗?的主要内容,如果未能解决你的问题,请参考以下文章
三星手机无法录制声音显示另一个应用程序正在使用麦克风怎么办?