2010-09-03 13 views
6

J'implémente AVAudioPlayer pour lire de l'audio et cela fonctionne parfaitement bien lors de la lecture de fichiers stockés localement dans le PC. Mais quand je donne l'URL d'un fichier audio sur Internet, elle échoue malheureusement. " Voici ce que le code ressemble à:lire l'audio à partir d'Internet en utilisant AVAudioPlayer

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

Quelqu'un pourrait s'il vous plaît signaler le problème et ce qui pourrait être fait?
Merci!

+0

Avez-vous essayé de fournir un objet d'erreur pour voir s'il contient une description d'erreur? – Toastor

+0

Non, mais l'application ne plante pas non plus ... juste la vue apparaît et rien ne se passe. – Bangdel

Répondre

2

J'ai essayé une autre méthode initWithData sur AVAudioPlayer au lieu de initWithContentsOfURL. Essayez d'abord d'obtenir le fichier MP3 dans NSData, puis lisez ces données.

Regardez mon code here.

17

C'est ce que les documents d'Apple disent:

La classe AVAudioPlayer ne fournit pas de support pour le streaming audio basé sur l'URL HTTP de. L'URL utilisée avec initWithContentsOfURL: doit être une URL de fichier (file://). Autrement dit, un chemin local.

27

Utilisez AVPlayer pour diffuser du contenu audio/vidéo en fonction des URL http. Cela fonctionnera bien. AVAudioPlayer est pour les fichiers locaux. Voici le code

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

Utilisez AVPlayer et surveillez son état pour démarrer la lecture.

Voici un exemple réalisable, espérons que ce serait utile.

@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