2015-02-07 129 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