在快速按下xcode的时候播放声音的最佳方法是什么?

我有一个音板,它只是一个约8个button的屏幕。 每个单独的button都会有自己的声音,按下button后会播放。有几种方法可以播放声音,比如使用SystemSound或者AVAudioPlayer系统的声音到目前为止似乎有最快的响应时间,avaudioplayer非常慢,它如果用户非常快地按下button,不能跟上,我创造了一个audio播放器,每个声音都很混乱。 这是如何即时播放声音的.h文件

@interface MainScreenViewController : UIViewController <AVAudioPlayerDelegate, UITabBarControllerDelegate> { AVAudioPlayer *player; CFURLRef keNURL; SystemSoundID keNObject; //KE LOUD CFURLRef keLURL; SystemSoundID keLObject; //GE NORMAL CFURLRef geNURL; SystemSoundID geNObject; //GE LOUD CFURLRef geLURL; SystemSoundID geLObject; //NA NORMAL CFURLRef naNURL; SystemSoundID naNObject; //NA LOUD CFURLRef naLURL; SystemSoundID naLObject; //RA CFURLRef raURL; SystemSoundID raObject; //DAGGA CLICK CFURLRef daCURL; SystemSoundID daCObject; //TILLI CLICK CFURLRef tiCURL; SystemSoundID tiCObject; } @property (nonatomic, retain) AVAudioPlayer *player; @property (readwrite) CFURLRef keNURL; @property (readonly) SystemSoundID keNObject; @property (readwrite) CFURLRef keLURL; @property (readonly) SystemSoundID keLObject; @property (readwrite) CFURLRef geNURL; @property (readonly) SystemSoundID geNObject; @property (readwrite) CFURLRef geLURL; @property (readonly) SystemSoundID geLObject; @property (readwrite) CFURLRef naNURL; @property (readonly) SystemSoundID naNObject; @property (readwrite) CFURLRef naLURL; @property (readonly) SystemSoundID naLObject; @property (readwrite) CFURLRef raURL; @property (readonly) SystemSoundID raObject; @property (readwrite) CFURLRef daCURL; @property (readonly) SystemSoundID daCObject; @property (readwrite) CFURLRef tiCURL; @property (readonly) SystemSoundID tiCObject; } 

那么播放个人声音的动作

然后.m文件,在导入.h文件和右边框架工作并合成所有variables之后,编写动作的代码,这就是单个动作中的内容。

 -(IBAction)geSound{ AudioServicesPlaySystemSound (self.geNObject); } 

我只是想知道systemsound是如何创造一个音板。 特别是当用户在敲击板上快速交替敲击板时。 。 如果不是最好的方式来播放响应真的很好的声音?

从经验上讲,AVAudioPlayer可以很好地同时或非常迅速地播放多个声音。 使用它的最好方法就是创build一个方法,以NSString进行播放,以播放NSString中名称的声音…这样,您将为每个播放的声音文件创build一个新的播放器。 除非你知道你已经完成了,否则要小心释放分配的玩家。

除非你有非常大的声音文件可能需要短暂的缓冲(如果你可以忍受任何延迟,你将不得不自己弄清楚),但是我从来没有遇到任何缓慢的问题。 如果速度很慢,你可能在解码某些文件方面做了一些反对苹果公司的build议(例如,对于多种声音,苹果公司推荐使用CAF格式,因为它是硬件解码而不是软件解码): http : //developer.apple。 COM / iphone /库/文件/ AVFoundation /参考/ AVAudioPlayerClassReference /参考/的reference.html

更新

以下是我如何使用shell脚本编码我的文件。 把它放在一个名为batchit.sh的文件中。 然后将您想要编码的.WAV文件放在该目录中的.CAF文件中。 打开你的Mac上的Terminalcd到该目录并inputsh batchit.sh ,让它做的事情。 它将批量转换所有的文件…这是代码:

 for f in *; do if [ "$f" != "batchit.sh" ] then /usr/bin/afconvert -f caff -d ima4 $f echo "$f converted" fi done 

这里是一个示例项目… http://www.megaupload.com/?d=5NP6FHR1

注意我在AVAudioPlayer的委托方法audioPlayerDidFinishPlaying方法中没有做任何事情。 你将需要添加代码来正确释放玩家完成游戏后(嘿,我不能为你做所有的工作:),以便所有的内存分配正确。 否则,如果你无限期地创造玩家而不释放它们,你将最终用完。 因为看起来你正在度过一个艰难的一天……请看下面的一个大提示。

这就是我可以给予的所有帮助。 你必须学习和赚取rest

 - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { // do something here if you want.. you know like maybe release the old players by uncommenting the line below :) //[player release]; } 

22/03/2014 – 更新:摆脱了我过度兴奋的post(这是很久以前写的),并更新以描绘一个更合适的答案。

我必须很好地控制audio,所以select使用OpenAL。 WOW是总结它的一种方法。 只要我自己使用OpenAL,需要一些额外的工作,实现所有必要的方法,并设置一切; 我发现自己实际上没有明显的延迟。 我非常满意的结果。

我能够同时实现良好的控制和无延迟。 我记得在我工作的时候,我高兴地跳了起来。

以下是我所使用的资源,这有助于缓解第一次实施OpenAL的努力:

  1. iPhone上的OpenAL
  2. 正是因为这个链接 这个video教程 ,我才能够创build出色的声音pipe理器单身人士。 这让我可以在任何一个我想要的声音pipe理下都能播放我需要的所有声音,这个单身人士为我做好了一切。

我虚心地build议大家使用OpenAL,如果您需要对audio进行精细控制,更重要的是,如果您需要低延迟按需audio,尤其是对于需要确保播放声音的游戏,则需要期望它是一个基于audio的应用程序。

只是为了他人的利益而添加,即使这是问题发生后的两年。

我发现,如果他们是短的声音,你会没事的(ISH)在你的应用程序加载。 通过运行准备播放每个声音的实例(在for循环中)来缓冲所有音轨(然后释放 – 只要您的处理器记住文件的位置)

这样可以在下次初次加载时消除初始加载时间,并让声音更快速地启动

你可以为每个声音创buildAVAudioPlayer,然后暂停/播放它。

你有没有尝试在自己的线程播放每个声音? 你可以尝试一个基本的NSOperation