Попытка исправить лаг AVAudioPlayer при его первоначальном использовании - PullRequest
4 голосов
/ 16 апреля 2011

Эта проблема обнаружена в нескольких других вопросах здесь на SO:

Медленный запуск для AVAudioPlayer при первом воспроизведении звука

Задержка вВоспроизведение звуков с использованием AVAudioPlayer

Я пытался реализовать предложенные исправления, но ни одно из них не решило мою проблему.Мое приложение предоставляет пользователю сетку объектов, к которым нужно прикоснуться, при прикосновении к объекту воспроизводится звук.Это прекрасно работает, за исключением того, что при первом касании задержка составляет ~ 2 секунды.

Чтобы обойти это, я инициализирую свой аудиоплеер с помощью фиктивного файла AIF:

- (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 секунды.

Есть ли способ обойти это?Должен ли я просто создать NSArray из AVAudioPlayers при загрузке и сказать им всем, что нужно подготовиться к игре, а затем просто вызвать play при нажатии на объект?

1 Ответ

4 голосов
/ 17 апреля 2011

Иногда это может помочь разрешить возврат 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];
}
...