AVAudioPlayer não reproduz nenhum som

Eu estou trabalhando em um aplicativo iOS que precisa reproduzir alguns sons usando o framework AVFoundation . A estrutura do espaço de trabalho no Xcode 4 contém dois projetos:

  • Área de trabalho
    • O aplicativo em si (projeto principal)
    • Uma biblioteca de utilitários

Depois de construir a biblioteca de utilitários, isso resulta em uma biblioteca estática que é usada no aplicativo principal como uma estrutura.

Então, ao tentar reproduzir um som dentro do aplicativo principal usando o código abaixo, ele funciona como esperado.

 NSString *resourcePath = [[NSBundle mainBundle] resourcePath]; NSString *path = [NSString stringWithFormat:@"%@/sound.mp3", resourcePath]; NSURL *url = [NSURL fileURLWithPath:path]; NSError *error = nil; AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; [audioPlayer play]; 

Em contraste, ao tentar reproduzir exatamente o mesmo som (ou qualquer outro) dentro da biblioteca de utilitários usando o mesmo código acima, nenhum som é reproduzido, mesmo que o erro seja nulo e os valores da propriedade audioPlayer sejam os corretos (número de canais, duração).

Eu verifiquei se o framework AVFoundation está em ambos os projetos.

Além disso, minha class usa o protocolo AVAudioPlayerDelegate e implementa esses dois methods:

 - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag; - (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error; 

Nenhum desses methods é chamado depois de tentar reproduzir o som.

Se eu usar a estrutura do AudioToolbox , ele reproduzirá o som. Mas estou interessado em usar o AVFoundation por vários motivos.

Alguma ideia do que está acontecendo? Estou faltando alguma coisa sobre o AVFoundation ? Poderia estar relacionado ao uso do AVAudioPlayer de dentro de uma biblioteca estática?

Desde já, obrigado.

Eu encontrei a solução e ela está relacionada a algo que eu não mencionei e não pensei: estou compilando com o Automatic Reference Counting (ARC).

O ARC insere uma chamada de lançamento para o reprodutor de áudio, portanto, ele é desalocado logo depois de sair do método em que é criado. Não tem nada a ver com o AVAudioPlayer mas com o ARC.

Para resolver esse problema, acabei de criar um atributo AVAudioPlayer para a class que lida com sons, para que ele não seja mais liberado pelo ARC. Bem, pelo menos, não é liberado até que a instância dessa class seja lançada.

Para obter mais informações sobre o ARC, consulte Contagem automática de referência: zerando referências fracas com detalhes sobre o motivo do problema.

Sim absolutamente; ARC foi a razão com o meu código também.

Eu introduzi uma propriedade:

 @property (strong, nonatomic) AVAudioPlayer *audioPlayer; 

e isso fez tudo funcionar bem.

use isso vai funcionar definitivamente ….

 AVAudioSession *session = [AVAudioSession sharedInstance]; [session setCategory:AVAudioSessionCategoryPlayback error:nil]; NSURL *url = [NSURL fileURLWithPath:@"path of the sound file :)"]; _player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [_player setDelegate:self]; [_player prepareToPlay]; [_player play]; 

Você configurou o AVAudioSession?

Eu tive um problema semelhante e consertei usando algo assim:

 AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:NULL]; 

ou

 [audioSession setCategory:AVAudioSessionCategoryPlayback error:NULL]; 

Espero que ajude.

Mesmo tendo o audioPlayer var declarado no escopo da class, ele não será reproduzido. Pelo menos no dispositivo físico iOS 10 iPhone 5c.

play() resultado é true portanto, nenhum erro parece acontecer.

Tive que adicionar isso ( Swift 3, 4 ) e agora ele toca o som corretamente.

 let session = AVAudioSession.sharedInstance() try! session.setCategory(AVAudioSessionCategoryPlayback) 

Eu criei um projeto de código aberto para um player de áudio simples. Dê uma olhada nisso se você tiver algum problema com a reprodução de áudio no iOS (em segundo plano também): https://github.com/wzbozon/DKAudioPlayer

Por favor, fique na página por algum tempo, eu estava enfrentando o mesmo problema. e use o sono para resolvê-lo.


 NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"sounds-1027-are-you-kidding" ofType:@"mp3"]]; AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [audioPlayer play]; sleep(2); 

Eu tive o mesmo problema. Eu tinha resolvido adicionando a linha abaixo no arquivo .h:

 @property (strong, nonatomic) AVAudioPlayer *audioPlayer; 

E no arquivo .m:

 NSError *error; NSString *soundFilePath = [NSString stringWithFormat:@"%@/dancepechance.mp3", [[NSBundle mainBundle] resourcePath]]; NSURL *url = [NSURL fileURLWithPath:soundFilePath]; self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; NSLog(@"Error %@",error); [self.audioPlayer prepareToPlay]; [self.audioPlayer play]; 

Você pode usar o AVPlayerViewController do AVKit para áudio e vídeo. O código está disponível para ambos c rápido e objective aqui .

Solução rápida:

  import AVFoundation // define your player in class var player = AVAudioPlayer() override func viewDidLoad() { super.viewDidLoad() }