2010-09-03 35 views
6

Sto implementando AVAudioPlayer per riprodurre audio e funziona perfettamente durante la riproduzione di file memorizzati localmente nel PC.riprodurre audio da Internet utilizzando AVAudioPlayer

Ma quando invio l'URL di un file audio su Internet, fallisce purtroppo. Ecco ciò che il codice è simile:

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

Qualcuno potrebbe si prega di segnalare il problema e cosa si poteva fare?
Grazie!

+0

Hai provato a fornire un oggetto di errore per vedere se contiene una descrizione di errore? – Toastor

+0

No, ma l'app non si arresta in modo anomalo ... viene visualizzata solo la vista e non accade nulla. – Bangdel

risposta

2

Ho provato l'altro metodo initWithData su AVAudioPlayer anziché initWithContentsOfURL. Prima cerca di ottenere il file MP3 in NSData e poi riproduci questi dati.

Guarda il mio codice here.

17

Questo è ciò che la documentazione di Apple dicono:

Il AVAudioPlayer classe non fornisce il supporto per lo streaming audio basato su HTTP URL. L'URL utilizzato con initWithContentsOfURL: deve essere un URL file (file://). Cioè, un percorso locale.

27

Utilizzare AVPlayer per lo streaming audio/video in base all'URL http. Funzionerà bene. AVAudioPlayer è per i file locali. Ecco il codice

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

Usa AVPlayer e monitorarne lo stato per avviare la riproduzione.

Ecco un esempio utile, spero che sarebbe 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 
Problemi correlati