Iphone SDK:声音问题

时间:2011-05-06 22:07:48

标签: iphone image button audio

我创建了一个鼓应用程序。截至目前,该应用程序有点令人满意但不是很好。

问题是我按下声音按钮时有时会发生奇怪的延迟或“延迟”。当我垃圾按钮时它开始冻结,当再次解冻时,它会播放相同的声音叠加在自身上大约4次:(

我做错了什么?

我的样品不好吗?

我应该使用imageView和touchesBegan来模拟按钮吗?

这是我用来在按下按钮时播放声音的代码:

- (IBAction) HHC {

    NSString *path = [[NSBundle mainBundle] pathForResource:@"HHClosed"ofType:@"wav"];

    SystemSoundID soundID;

    AudioServicesCreateSystemSoundID((CFURLRef) [NSURL fileURLWithPath:path], &soundID);

    AudioServicesPlaySystemSound (soundID);

}

请给我一些好的建议:)

提前致谢

-DD

3 个答案:

答案 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声音样本。首先阅读一本关于数字音频技术的书。