1

我有一个 iPhone 应用程序,当用户参加考试时,我会在其中播放声音。效果很好,除了第一次播放声音时有延迟,我假设将声音加载到内存中。如何预加载声音?这是我的声音代码:

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

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

}

4

3 回答 3

2

查看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];
    如果(错误)
        NSLog(@"为 %@ 创建播放器时出错:%@", fileName, [error localDescription]);

    return (error ? nil : player);
}

在您的应用程序中的某处,您可能会像这样设置一个播放器对象:

AVAudioPlayer *buzzSoundPlayer = [MyClass playerForFile:@"buzz"];
if (buzzSoundPlayer) {
    [buzzsoundPlayer prepareToPlay];
}

当您想播放声音时:

[buzzSoundPlayer setCurrentTime:0];
[buzzSoundPlayer play];

您必须将当前时间设置为0,即声音文件的开头,每次播放它,因为当声音播放完毕时,“当前时间”在结尾。因此,后续播放它的请求将不会播放任何内容。所以我们将当前时间设置回开始。

您也可以为您的播放器设置一个delegate,并在声音播放完毕时通过委托方法得到通知。或者,您可以在那里将当前时间重置为 0。

您可以在 Apple 的文档中阅读有关AVAudioPlayer、 和的所有内容。AVFoundation

于 2012-10-24T19:35:11.813 回答
1

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

于 2012-10-26T13:15:08.453 回答
-1

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

您也可以在应用程序启动时或之前的某个地方加载文件,而不是实际接触。

于 2012-10-24T18:53:03.047 回答