AVAudioPlayer не будет играть неоднократно - PullRequest
6 голосов
/ 19 июня 2011

У меня есть относительно простое приложение, которое воспроизводит звук с использованием AVAudioPlayer, например:

NSURL *file3 = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/ball_bounce.aiff", [[NSBundle mainBundle] resourcePath]]];
player3 = [[AVAudioPlayer alloc] initWithContentsOfURL:file3 error:nil];
[player3 prepareToPlay];

для последующего вызова для воспроизведения, например:

[player3 play];

Ноэтот звук вызывается в нескольких местах (столкновения с прыгающим мячом), много раз.Иногда мяч ударяется о две вещи достаточно быстро, когда звук первого удара все еще звучит, когда мяч сталкивается во второй раз.Этот второй отскок не производит звук.Как я могу заставить его воспроизводить звук каждый раз, когда он сталкивается, даже если он предполагает оплату звука, который перекрывает уже воспроизводимый звук?

Любая помощь очень ценится.

Ответы [ 2 ]

3 голосов
/ 19 июня 2011

Одним из способов решения этой проблемы было бы создание нового экземпляра AVAudioPlayer, если предыдущий уже воспроизводится:

if([player3 isPlaying]) {
   AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[player3 url]];
   [newPlayer setDelegate:self];
   [newPlayer play];
}

Затем в методе делегата audioPlayerDidFinishPlaying:successfully: вы должны отправить игроку сообщение -release:

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
   if(player != player3) {
      [player release];
   }
}

Так оно и должно быть, так как вам нужен новый буфер источника для каждого одновременного воспроизведения звука. (

0 голосов
/ 29 июля 2015

Это старая ветка, но, возможно, кто-то может извлечь пользу из этого ответа. Повторное создание AVAudioPlayer может быть бременем для приложения и может создавать лаги. В этом случае вы можете использовать SystemSound.

NSString *pathToMySound = [[NSBundle mainBundle] pathForResource:@"yourMusic" ofType:@"mp3"];
SystemSoundID soundID;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)([NSURL fileURLWithPath: pathToMySound]), &soundID);
AudioServicesPlaySystemSound(soundID);

Недостатком этого решения является невозможность регулировки громкости.

...