我正在开发一个应用程序,用户可以点击多个产生声音的命中区域 但结果有点滞后,当多个声音同时开始时,声音播放时会有一个难看的延迟。
我正在为每个声音使用AVAudioPlayer实例。 是否有更好的方式播放声音并防止这种滞后?
以下是代码:
#import "MBImageView.h"
#import <AVFoundation/AVFoundation.h>
@implementation MBImageView
-(void)awakeFromNib
{
NSURL* audioFile = [NSURL fileURLWithPath[[NSBundlemainBundle] pathForResource:@"shaker"
ofType:@"caf"]];
AudioServicesCreateSystemSoundID((CFURLRef)audioFile, &shortSound);
}
- (id)initWithImage:(UIImage *)image{
return self;
}
- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
AudioServicesPlaySystemSound(shortSound);
}
@end
问候。
答案 0 :(得分:6)
大多数声音(AVAudioPlayer和AudioServices)在runloop结束后播放。也就是说,你说游戏,他们排队等待比赛,他们不会立即开始比赛。
如果您想要无滞后声音,请使用Audio Unit:
提供最低延迟的音频, 特别是同时做的时候 输入和输出(例如用于VoIP) 应用程序),使用I / O单元或 语音处理I / O单元。请参阅“音频 iPhone OS中的单元支持。“
您可能还想查看Audio Toolbox:
使用音频工具箱框架 同步播放音频 功能,访问数据包 传入音频,解析音频流, 转换音频格式,并记录 可以访问个人的音频 数据包。有关详情,请参阅音频 工具箱框架参考和 SpeakHere示例代码项目。
答案 1 :(得分:1)
如果它们是你不介意加载到内存中的短音,那么基于C的System Sound Services可能会更适合你。
答案 2 :(得分:0)
我在Audio Toolbox中使用了SoundEffect类,效果很好。我的短暂声音没有延迟。
另外还有一个需要考虑音频延迟的事情;确保你的音频文件在实际声音之前没有“空白” - 一旦寻找声音延迟,我就把头撞到了墙上,只是在实际的音频文件中找到它。
希望这有帮助。