Estoy intentando reproducir una canción de la biblioteca de música de mi iPhone con AVPlayer. Todo parece listo para jugar, pero el jugador simplemente no hará ningún sonido. He estado luchando con esto por un tiempo, ¡cualquier ayuda sería muy apreciada!AVPlayer no se reproduce desde la biblioteca de música
Nota: Me di cuenta de que podía utilizar AVAudioPlayer, pero me gustaría leer el archivo desde la biblioteca de música y, a mi entender, AVAudioPlayer no admite que (yo tendría que exportar la canción primera, tomando más tiempo). No puedo usar MPMusicPlayerController porque el objetivo final es convertir la canción en NSData y reproducirla en otro dispositivo.
Por encima de todo, me gustaría saber por qué este código no está jugando:
NSArray *itemsFromQuery = [[MPMediaQuery songsQuery] items];
MPMediaItem *song = [itemsFromQuery objectAtIndex:29];
NSURL *songURL = [song valueForProperty:MPMediaItemPropertyAssetURL];
AVURLAsset *urlAsset = [[AVURLAsset alloc] initWithURL:songURL options:nil];
NSArray *keyArray = [[NSArray alloc] initWithObjects:@"tracks", nil];
[urlAsset loadValuesAsynchronouslyForKeys:keyArray completionHandler:^{
AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithAsset:urlAsset];
AVPlayer *player = [[AVPlayer alloc] initWithPlayerItem:playerItem];
while (true) {
if (player.status == AVPlayerStatusReadyToPlay && playerItem.status == AVPlayerItemStatusReadyToPlay) {
break;
}
}
if (player.status == AVPlayerStatusReadyToPlay && playerItem.status == AVPlayerItemStatusReadyToPlay) {
NSLog(@"Ready to play");
[player play];
}
else
NSLog(@"Not ready to play");
}];
La salida está "listo para jugar", y el "tipo" de la propiedad es de 1,0 AVPlayer después de que llamo el método de juego. El MPMediaItem existe, y puedo usar el método valueForProperty para obtener el título correcto, el artista, etc. ¿Alguna idea de por qué no sale sonido del reproductor?
¿Intentó declarar AVPlayer y AVPlayerItem fuera del bloque, como justo después de 'NSArray * keyArray'? – meggar
Lo hice. Declararlos e inicializarlos al aire libre no hace la diferencia. Declararlos fuera e inicializarlos dentro del controlador está aparentemente prohibido. ¡Gracias por la idea! – JohnG