2010-09-03 26 views
6

Estoy implementando AVAudioPlayer para reproducir audio y funciona perfectamente mientras reproduzco archivos almacenados localmente en la PC.reproducir audio de Internet usando AVAudioPlayer

Pero cuando doy la url de algún archivo de audio a través de Internet, falla tristemente. Esto es lo que se ve el código como:

NSString *url = [[NSString alloc] init]; 
url = @"http://files.website.net/audio/files/audioFile.mp3"; 
NSURL *fileURL = [[NSURL alloc] initWithString: url]; 
AVAudioPlayer *newPlayer =[[AVAudioPlayer alloc] initWithContentsOfURL: fileURL error: nil]; 

Podría alguien por favor señalar el problema y qué se podía hacer?
Gracias!

+0

¿Ha intentado proporcionar un objeto de error para ver si contiene una descripción del error? – Toastor

+0

No, pero la aplicación tampoco falla ... solo aparece la vista y no pasa nada. – Bangdel

Respuesta

2

He probado otro método initWithData en AVAudioPlayer en lugar de initWithContentsOfURL. Primero intente obtener un archivo MP3 en NSData y luego reproducir esta información.

Mira mi código here.

17

Esto es lo que dicen los documentos de Apple:

El AVAudioPlayer clase no proporciona soporte para el streaming de audio basado en el URL de HTTP. La URL utilizada con initWithContentsOfURL: debe ser una URL de archivo (file://). Es decir, un camino local.

27

Use AVPlayer para transmitir audio/video basado en http url's. Funcionará bien. AVAudioPlayer es para archivos locales. Aquí está el código

NSURL *url = [NSURL URLWithString:url];  
self.avAsset = [AVURLAsset URLAssetWithURL:url options:nil];  
self.playerItem = [AVPlayerItem playerItemWithAsset:avAsset];  
self.audioPlayer = [AVPlayer playerWithPlayerItem:playerItem];  
[self.audioPlayer play]; 
0

Uso AVPlayer y supervisar su estado para iniciar la reproducción.

Aquí hay un ejemplo viable, espero que sea útil.

@implementation AudioStream 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context 
{ 
    if (context == PlayerStatusContext) { 
     AVPlayer *thePlayer = (AVPlayer *)object; 
     switch ([thePlayer status]) { 
      case AVPlayerStatusReadyToPlay: 
       NSLog(@"player status ready to play"); 
       [thePlayer play]; 
       break; 
      case AVPlayerStatusFailed: 
       NSLog(@"player status failed"); 
       break; 
      default: 
       break; 
     } 
     return; 
    } else if (context == ItemStatusContext) { 
     AVPlayerItem *thePlayerItem = (AVPlayerItem *)object; 
     switch ([thePlayerItem status]) { 
      case AVPlayerItemStatusReadyToPlay: 
       NSLog(@"player item ready to play"); 
       break; 
      case AVPlayerItemStatusFailed: 
       NSLog(@"player item failed"); 
       break; 
      default: 
       break; 
     } 
     return; 
    } 

    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
} 

- (void)playAudioStream 
{ 
    NSURL *audioUrl = [NSURL URLWithString:@"your_stream_url"]; 
    AVURLAsset *audioAsset = [AVURLAsset assetWithURL:audioUrl]; 
    AVPlayerItem *audioPlayerItem = [AVPlayerItem playerItemWithAsset:audioAsset]; 
    [audioPlayerItem addObserver:self forKeyPath:@"status" options:0 context:ItemStatusContext]; 
    self.player = [AVPlayer playerWithPlayerItem:audioPlayerItem]; 
    [self.player addObserver:self forKeyPath:@"status" options:0 context:PlayerStatusContext]; 
} 

@end 
Cuestiones relacionadas