AVAudioPlayer non riproduce alcun suono

Sto lavorando a un’applicazione iOS che ha bisogno di riprodurre alcuni suoni utilizzando il framework AVFoundation . La struttura dello spazio di lavoro in Xcode 4 contiene due progetti:

  • Area di lavoro
    • L’applicazione stessa (progetto principale)
    • Una libreria di utilità

Dopo aver creato la libreria di utilità, risulta in una libreria statica che viene utilizzata nell’applicazione principale come framework.

Quindi, quando si tenta di riprodurre un suono all’interno dell’applicazione principale utilizzando il codice seguente, funziona come previsto.

 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]; 

Al contrario, quando si tenta di riprodurre esattamente lo stesso suono (o qualsiasi altro) all’interno della libreria di utilità utilizzando lo stesso codice di cui sopra, non viene riprodotto alcun suono, anche se l’errore è zero e i valori delle proprietà di audioPlayer sono quelli giusti (numero di canali, durata).

Mi sono assicurato che il framework AVFoundation sia in entrambi i progetti.

Inoltre, la mia class utilizza il protocollo AVAudioPlayerDelegate e implementa questi due metodi:

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

Nessuno di questi metodi viene chiamato dopo aver provato a riprodurre il suono.

Se invece utilizzo il framework AudioToolbox , riproduce il suono. Ma sono interessato all’utilizzo di AVFoundation per diversi motivi.

Qualche idea di cosa sta succedendo? Mi sto perdendo qualcosa su AVFoundation ? Potrebbe essere collegato all’uso di AVAudioPlayer da una libreria statica?

Grazie in anticipo.

Ho trovato la soluzione ed è correlata a qualcosa che non ho menzionato e non ho pensato: sto compilando con Automatic Reference Counting (ARC).

ARC inserisce una chiamata di rilascio al lettore audio, quindi viene deallocato subito dopo aver lasciato il metodo in cui è stato creato. Non ha nulla a che fare con AVAudioPlayer ma con ARC.

Per risolvere questo problema, ho appena creato un attributo AVAudioPlayer per la class che AVAudioPlayer i suoni in modo che non venga più rilasciato da ARC. Bene, almeno, non viene rilasciato fino a quando l’istanza di questa class non viene rilasciata.

Per ulteriori informazioni su ARC, fare riferimento a Conteggio di riferimento automatico: azzeramento di riferimenti deboli con dettagli sul motivo per cui ho riscontrato questo problema.

Si assolutamente; ARC era anche la ragione del mio codice.

Ho introdotto una proprietà:

 @property (strong, nonatomic) AVAudioPlayer *audioPlayer; 

e questo ha fatto funzionare tutto bene.

usa questo funzionerà sicuramente ….

 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]; 

Hai configurato AVAudioSession?

Ho avuto un problema simile e l’ho risolto usando qualcosa di simile a questo:

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

o

 [audioSession setCategory:AVAudioSessionCategoryPlayback error:NULL]; 

Spero che sia d’aiuto.

Pur avendo dichiarato audioPlayer var nello scope della class, non verrà riprodotto. Almeno su dispositivo iOS 10 iPhone 5c fisico.

play() è true quindi non sembra che si verifichino errori.

Dovevo aggiungere questo ( Swift 3, 4 ) e ora riproduce correttamente il suono.

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

Ho creato un progetto open source per un semplice lettore audio. Dai un’occhiata se hai problemi con la riproduzione audio in iOS (anche in background): https://github.com/wzbozon/DKAudioPlayer

Si prega di rimanere sulla pagina per qualche tempo, stavo affrontando lo stesso problema. e usa il sonno per risolverlo.


 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); 

Ho avuto lo stesso problema. L’ho risolto aggiungendo sotto la riga nel file .h:

 @property (strong, nonatomic) AVAudioPlayer *audioPlayer; 

E nel file .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]; 

È ansible utilizzare AVPlayerViewController da AVKit invece per audio e video. Il codice è disponibile sia per il rapido che per l’objective c qui .

Soluzione rapida:

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