objective c - AVAudioPlayer no reproduce ningún sonido
objective-c xcode4 (9)
¿Ha configurado la sesión AVAudioSession?
Tuve un problema similar y lo solucioné usando algo como esto:
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:NULL];
o
[audioSession setCategory:AVAudioSessionCategoryPlayback error:NULL];
Espero eso ayude.
Estoy trabajando en una aplicación iOS que necesita reproducir algunos sonidos utilizando el marco AVFoundation
. La estructura del espacio de trabajo en Xcode 4 contiene dos proyectos:
- Espacio de trabajo
- La aplicación en sí (proyecto principal)
- Una biblioteca de utilidad
Después de compilar la biblioteca de utilidades, da como resultado una biblioteca estática que se utiliza en la aplicación principal como marco.
Por lo tanto, cuando intente reproducir un sonido dentro de la aplicación principal utilizando el siguiente código, funciona como se espera.
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];
Por el contrario, cuando intenta reproducir exactamente el mismo sonido (o cualquier otro) dentro de la biblioteca de utilidades utilizando el mismo código que el anterior, no se reproduce ningún sonido, aunque el error sea nulo y los valores de la propiedad audioPlayer sean los correctos (número de canales, duración).
Me he asegurado de que el marco AVFoundation
esté en ambos proyectos.
Además, mi clase utiliza el protocolo AVAudioPlayerDelegate
e implementa estos dos métodos:
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error;
Ninguno de estos métodos se invoca después de intentar reproducir el sonido.
Si utilizo el marco AudioToolbox
lugar, entonces reproduce el sonido. Pero estoy interesado en usar AVFoundation
por varias razones.
¿Alguna idea de lo que está pasando? ¿Me estoy perdiendo algo acerca de AVFoundation
? ¿Podría estar relacionado con el uso de AVAudioPlayer
desde dentro de una biblioteca estática?
Gracias por adelantado.
Encontré la solución y está relacionada con algo que no mencioné y en la que no pensé: estoy compilando con Conteo automático de referencias (ARC).
ARC inserta una llamada de liberación al reproductor de audio, por lo que se desasigna justo después de abandonar el método donde se creó. No tiene nada que ver con AVAudioPlayer
pero con ARC.
Para resolver este problema, acabo de crear un atributo AVAudioPlayer
para la clase que trata con los sonidos para que ARC no los suelte. Bueno, al menos, no se lanza hasta que se lanza la instancia de esta clase.
Para obtener más información acerca de ARC, consulte Recuento de referencias automáticas: reducir a cero las referencias débiles con detalles sobre por qué tuve este problema.
He creado un proyecto de código abierto para reproductor de audio simple. Eche un vistazo si tiene algún problema con la reproducción de audio en iOS (también en segundo plano): https://github.com/wzbozon/DKAudioPlayer
Incluso teniendo audioPlayer var declarado en el alcance de la clase, no se reproducirá. Al menos en iOS 10 iPhone 5c dispositivo físico.
play()
es true
por lo que no parece que haya errores.
Tuve que agregar esto ( Swift 3, 4 ) y ahora reproduce el sonido correctamente.
let session = AVAudioSession.sharedInstance()
try! session.setCategory(AVAudioSessionCategoryPlayback)
Por favor permanezca en la página por un tiempo, yo estaba enfrentando el mismo problema. y usa el sueño para resolverlo.
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);
Si, absolutamente; ARC fue la razón con mi código también.
Introduje una propiedad:
@property (strong, nonatomic) AVAudioPlayer *audioPlayer;
y eso hizo que todo salga bien.
Solución Swift:
import AVFoundation
// define your player in class
var player = AVAudioPlayer()
override func viewDidLoad() {
super.viewDidLoad()
}
Tuve el mismo problema. Lo resolví agregando la línea siguiente en el archivo .h:
@property (strong, nonatomic) AVAudioPlayer *audioPlayer;
Y en el archivo .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];
usa esto, 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];