2015-02-07 148 views
0

我是一個相對較新的iOS開發人員,我正在撰寫一個應用程序,用於處理來自網站上mp3文件的音頻流。iOS流媒體MP3文件

我想在播放音頻時播放音頻,我希望用戶能夠通過音頻進行擦洗。

我看到其他職位使用

NSData *songData=[NSData dataWithContentsOfURL:url];  
[[AVAudioPlayer alloc] initWithData:songData error:nil];  

但dataWithContentsOfURL:是同步的,將阻止主線程,而不是流,而不是我所期待的。

理想情況下,我正在尋找某種方式,可以在接收到數據時訪問數據字節,將它們存儲在緩衝區中,然後在某些時候播放可能不完整的緩衝區(不一定立即)數據

的我不知道如果有一種方法與AVPlayer做到這一點,或者如果我需要考慮的Core Audio等

可有人請給我在正確的方向?

回答

0

這是Apple提供的一個例子,如何接收流並解析它。

Apple example

audioFileStreamParser Reference

+0

[鏈接](http://www.cocoawithlove.com/2008/09/streaming-and-playing- live-mp3-stream.html)以下是如何解決使用蘋果代碼可能發生的一些問題以及如何通過音頻尋找的指南。 – Duc 2015-02-07 20:00:37

0

AVPlayer支持蒸。 AVAudioPlayer沒有。

事情是這樣的片段,假設你已經創建了一個名爲songPlayer屬性:

AVPlayer *player = [AVPlayer playerWithURL:url]; 
self.songPlayer = player; 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(playerItemDidReachEnd:) 
              name:AVPlayerItemDidPlayToEndTimeNotification 
              object:[self.songPlayer currentItem]]; 
[self.songPlayer addObserver:self forKeyPath:@"status" options:0 context:nil]; 

- (void)playerItemDidReachEnd:(NSNotification *)notification { 

    // code here when song reached the end 

} 
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 

    if (object == self.songPlayer && [keyPath isEqualToString:@"status"]) 
    { 
     if (self.songPlayer.status == AVPlayerStatusFailed) { 
      NSLog(@"AVPlayer Failed"); 

     } else if (self.songPlayer.status == AVPlayerStatusReadyToPlay) { 
      NSLog(@"AVPlayerStatusReadyToPlay"); 
      [self.songPlayer play]; 


     } else if (self.songPlayer.status == AVPlayerItemStatusUnknown) { 
      NSLog(@"AVPlayer Unknown"); 

     } 
    } 
} 
+1

我一直在使用AVPlayer,但通過在運行我的應用程序時查看網絡活動,它看起來像是立即下載所有歌曲,而不是流式傳輸。 – 2015-02-11 18:07:22