4

这个问题已经出现在关于 SO 的其他几个问题中:

第一次播放声音时 AVAudioPlayer 启动缓慢

使用 AVAudioPlayer 延迟播放声音

我已经尝试实施建议的修复程序,但没有一个解决我的问题。我的应用程序向用户展示了要触摸的对象网格,当触摸对象时会播放声音。这很好用,除了在初次触摸时会有约 2 秒的延迟。

为了解决这个问题,我用一个虚拟的 aiff 文件初始化我的音频播放器:

- (void)viewDidLoad{
    NSString *soundFile = [Card loadCardSoundPath:@"dummy"];

    AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:
                             [NSURL fileURLWithPath:soundFile] error:nil];
    self.audioPlayer = player;
    [audioPlayer setDelegate:self];
    [audioPlayer prepareToPlay];
//    [audioPlayer play];
    [player release];
...
[super viewDidLoad]; 
}

然后当一个对象被触摸时,我调用:

NSString *soundFile = [Card loadCardSoundPath:name];

if (soundFile != nil){

            AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:
                                     [NSURL fileURLWithPath:soundFile] error:nil];
            self.audioPlayer = player;
            [self.audioPlayer setDelegate:self];
            [self.audioPlayer prepareToPlay];
            [self.audioPlayer play];
            [player release]; 
}

我观察到的行为是这样的:如果我创建一个虚拟音频播放器并调用 prepareToPlay 但不播放,我会在单击第一个对象时观察到音频延迟。但是,如果我在虚拟音频播放器上调用 play,那么我不会得到初始对象的延迟,但视图加载会延迟 2 秒。

有没有办法解决这个问题?我是否应该在加载时简单地创建一个 AVAudioPlayers 的 NSArray 并告诉他们准备播放,然后在单击对象时调用 play?

4

1 回答 1

4

有时它可以viewDidLoad通过使用peformSelector:withObject:afterDelay:. 例如:

- (void)viewDidLoad{
    // initialization ...
    [super viewDidLoad]; 
    [self performSelector:@selector(primeAudioPlayer) withObject:nil afterDelay:0.1];
}

-(void)primeAudioPlayer {
    NSString *soundFile = [Card loadCardSoundPath:@"dummy"];

    AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:
                             [NSURL fileURLWithPath:soundFile] error:nil];
    [audioPlayer prepareToPlay];
    [player release];
}
于 2011-04-16T23:48:19.347 回答