61 votes

AVAudioPlayer ne joue aucun son

Je suis en train de travailler sur une application iOS qui a besoin de jouer des sons à l'aide de l' AVFoundation - cadre. L'espace de travail de la structure dans Xcode 4 contient deux projets:

  • Espace de travail
    • L'application elle-même (projet principal)
    • Un utilitaire de bibliothèque

Après la construction de l'installation de la bibliothèque, il en résulte une bibliothèque statique qui est utilisé dans l'application principale en tant que cadre.

Donc, lorsque vous essayez de jouer un son à l'intérieur de l'application principale en utilisant le code ci-dessous, il fonctionne comme prévu.

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

En revanche, lorsque essayant de jouer exactement le même son (ou autre) à l'intérieur de l'utilité de la bibliothèque en utilisant le même code que ci-dessus, aucun son n'est joué, même si l'erreur est nulle et l' audioPlayer les valeurs de propriété sont celles de droite (nombre de canaux, la durée).

J'ai fait en sorte que le AVFoundation cadre de deux projets.

Aussi, ma classe utilise l' AVAudioPlayerDelegate protocole et met en œuvre ces deux méthodes:

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

Aucune de ces méthodes est appelée après avoir essayé de jouer le son.

Si j'utilise l' AudioToolbox - cadre au lieu de cela, alors qu'il joue le son. Mais je suis intéressé par l'utilisation AVFoundation , pour plusieurs raisons.

Toute idée de ce qui se passe? Ai-je raté quelque chose à propos de AVFoundation? Il pourrait être relié à l'aide d' AVAudioPlayer depuis l'intérieur d'une bibliothèque statique?

Merci à l'avance.

161voto

msoler Points 1323

J'ai trouvé la solution et c'est lié à quelque chose que je n'ai pas mentionné et ne pensez pas à ce sujet: je suis de la compilation Automatique de Comptage de Référence (ARC).

ARC insère un communiqué de l'appeler pour le lecteur audio, il est donc libéré à droite après avoir quitté la méthode où il est créé. Il n'a rien à voir avec AVAudioPlayer mais avec de l'ARC.

Afin de résoudre ce problème, je viens de créer un AVAudioPlayer attribut de la classe qui traite avec des sons de sorte qu'il n'est pas sorti non plus par l'ARC. Eh bien, au moins, il n'est pas libéré jusqu'à ce que l'instance de cette classe est libéré.

Pour plus d'informations sur l'ARC, de prendre un coup d'oeil à la Compréhension Automatique de Comptage de Référence en Objective-C. Il y a une section appelée Référence Compté Mémoire: Examen Rapide avec des détails sur pourquoi j'ai eu cette question.

37voto

uem Points 353

Oui absolument; ARC était aussi la raison de mon code.

J'ai introduit une propriété:

 @property (strong, nonatomic) AVAudioPlayer *audioPlayer;
 

et cela a bien fonctionné.

27voto

Anshul Points 41

utilisez ceci cela fonctionnera définitivement ....

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

19voto

nano Points 323

Avez-vous configuré AVAudioSession?

J'ai eu un problème similaire et l'ai corrigé en utilisant quelque chose comme:

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

ou

 [audioSession setCategory:AVAudioSessionCategoryPlayback error:NULL];
 

J'espère que ça aide.

0voto

wzbozon Points 2851

J'ai créé un projet open source pour lecteur audio simple. Jetez-y un coup d'œil si vous rencontrez des problèmes de lecture audio dans iOS (en arrière-plan aussi): https://github.com/wzbozon/DKAudioPlayer

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X