2012-06-19 13 views
5

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?

+1

¿Intentó declarar AVPlayer y AVPlayerItem fuera del bloque, como justo después de 'NSArray * keyArray'? – meggar

+0

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

Respuesta

12

encontrado algo que funcionó:

  1. me hizo el AVPlayer una propiedad (gracias por la punta! Meggar)
  2. me aseguré de que el AVPlayer fue nula antes de utilizar el método initWithAsset.

    NSArray *itemsFromQuery = [[MPMediaQuery songsQuery] items]; 
    MPMediaItem *song = [itemsFromQuery objectAtIndex:0]; 
    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]; 
    
        player = nil; 
        player = [[AVPlayer alloc] initWithPlayerItem:playerItem]; 
    
        while (true) { 
         if (player.status == AVPlayerStatusReadyToPlay && playerItem.status == AVPlayerItemStatusReadyToPlay) 
          break; 
        } 
    
        [player play]; 
    
    }]; 
    

Espero que esto ayude a alguien!

+1

Muchas gracias. De Verdad. Gracias. Mucho. – duci9y

1

Otro motivo es la configuración de AVAudioSession. Trabajó para mi.

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 
    [[AVAudioSession sharedInstance] setActive: YES error: nil]; 
Cuestiones relacionadas