我有一个iPhone应用程序,我在用户进行测试时播放声音。效果很好,除了第一次声音播放时有延迟,我假设将声音加载到内存中。我该怎么预加载声音?这是我的声音代码:
- (void)doBuzz:(id)sender {
SystemSoundID buzzsoundID;
NSString *buzzsoundFile = [[NSBundle mainBundle]
pathForResource:@"buzz" ofType:@"caf"];
AudioServicesCreateSystemSoundID((CFURLRef)
[NSURL fileURLWithPath:buzzsoundFile]
, &buzzsoundID);
AudioServicesPlaySystemSound(buzzsoundID);
}
答案 0 :(得分:3)
查看AVAudioPlayer
,您可以设置并重复使用。但更重要的是,当你设置它时,你可以告诉它“准备播放”,它将声音预加载到内存中。因此,当您实际告诉玩家玩游戏时,它会立即播放。我方便地,最近为某些东西编写了这个方法,它创建并返回一个AVAudioPlayer
对象:
+(AVAudioPlayer *)playerForFile:(NSString *)fileName { NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"caf"]; NSURL *url = [NSURL fileURLWithPath:filePath]; NSData *soundData = [NSData dataWithContentsOfURL:url]; NSError *error = nil; AVAudioPlayer *player = [[[AVAudioPlayer alloc] initWithData:soundData error:&error] autorelease]; if (error) NSLog(@"error creating player for %@: %@", fileName, [error localizedDescription]); return (error ? nil : player); }
您应用中的某个位置可能会设置一个像这样的播放器对象:
AVAudioPlayer *buzzSoundPlayer = [MyClass playerForFile:@"buzz"];
if (buzzSoundPlayer) {
[buzzsoundPlayer prepareToPlay];
}
当你想播放声音时:
[buzzSoundPlayer setCurrentTime:0];
[buzzSoundPlayer play];
您必须将当前时间设置为0,即声音文件的开头,每次播放时都会因为声音结束播放时“当前时间”结束。所以后来发挥它的要求什么也不会发挥作用。所以我们将当前时间设置回到开头。
您也可以为播放器设置delegate
,并在声音播放完毕后通过委托方式通知。你可以将当前时间重置为0,或者。
您可以在Apple的文档中阅读有关AVAudioPlayer
和AVFoundation
的所有内容。
答案 1 :(得分:1)
我通过将SystemSoundID的声明移动到我的UIViewController的.h文件中来修复声音延迟问题,然后设置NSString并从ViewDidLoad调用AudioServicesCreateSystemSoundID。然后,当我想播放声音时,我只是用AudioServicesPlaySystemSound替换它,而不是调用doBuzz方法。
答案 2 :(得分:-1)
使用performSelectorInBackground:@selector(<SELECTOR>)
预加载声音。
您还可以在应用程序启动时或之前的某个位置加载文件,而不是实际触摸。