我创建了一个鼓应用程序。截至目前,该应用程序有点令人满意但不是很好。
问题是我按下声音按钮时有时会发生奇怪的延迟或“延迟”。当我垃圾按钮时它开始冻结,当再次解冻时,它会播放相同的声音叠加在自身上大约4次:(
我做错了什么?
我的样品不好吗?
我应该使用imageView和touchesBegan来模拟按钮吗?
这是我用来在按下按钮时播放声音的代码:
- (IBAction) HHC {
NSString *path = [[NSBundle mainBundle] pathForResource:@"HHClosed"ofType:@"wav"];
SystemSoundID soundID;
AudioServicesCreateSystemSoundID((CFURLRef) [NSURL fileURLWithPath:path], &soundID);
AudioServicesPlaySystemSound (soundID);
}
请给我一些好的建议:)
提前致谢
-DD
答案 0 :(得分:1)
每次按下按钮,您都会从文件系统加载声音文件,将其带入内存,然后播放。
这是非常低效的。您的音频样本应该已经在启动时加载到内存中,因此无需从文件系统中读取它们。此外,AudioServicesPlaySystemSound
并非真正设计用于此类用途 - 其主要目的是播放短警报声音(即系统警报)。如果您需要低延迟音频播放,则应该查看Core Audio
框架。
答案 1 :(得分:1)
尝试这样做,看看它是否能让你的表现更好。
在.h文件中声明:
SystemSoundID soundID;
在-viewDidLoad方法的.m文件中添加以下代码:
-(void) viewDidLoad {
NSString *path = [[NSBundle mainBundle] pathForResource:@"HHClosed"ofType:@"wav"];
AudioServicesCreateSystemSoundID((CFURLRef) [NSURL fileURLWithPath:path], &soundID);
}
在您展示的方法中,只需保留以下一行代码:
- (IBAction) HHC {
AudioServicesPlaySystemSound (soundID);
}
让我知道是否会导致冻结消失。如果没有尝试Core Audio
答案 2 :(得分:1)
对于适用于鼓应用的低延迟声音,您需要使用RemoteIO Audio Unit API,这并不简单。您将需要知道如何处理,缓冲和混合PCM声音样本。首先阅读一本关于数字音频技术的书。