我怎样才能预加载声音?

时间:2012-10-24 18:41:20

标签: iphone xcode audio

我有一个iPhone应用程序,我在用户进行测试时播放声音。效果很好,除了第一次声音播放时有延迟,我假设将声音加载到内存中。我该怎么预加载声音?这是我的声音代码:

- (void)doBuzz:(id)sender {
SystemSoundID buzzsoundID;
NSString *buzzsoundFile = [[NSBundle mainBundle]
                           pathForResource:@"buzz" ofType:@"caf"];

AudioServicesCreateSystemSoundID((CFURLRef)
                                 [NSURL fileURLWithPath:buzzsoundFile]
                                 , &buzzsoundID);
AudioServicesPlaySystemSound(buzzsoundID);

}

3 个答案:

答案 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的文档中阅读有关AVAudioPlayerAVFoundation的所有内容。

答案 1 :(得分:1)

我通过将SystemSoundID的声明移动到我的UIViewController的.h文件中来修复声音延迟问题,然后设置NSString并从ViewDidLoad调用AudioServicesCreateSystemSoundID。然后,当我想播放声音时,我只是用AudioServicesPlaySystemSound替换它,而不是调用doBuzz方法。

答案 2 :(得分:-1)

使用performSelectorInBackground:@selector(<SELECTOR>)预加载声音。

您还可以在应用程序启动时或之前的某个位置加载文件,而不是实际触摸。