iOS流媒体MP3文件

时间:2015-02-07 19:07:03

标签: ios audio streaming buffer mp3

我是iOS的相对较新的开发人员,我正在编写一个应用程序来处理来自网站上mp3文件的流式音频。

我希望在播放音频时播放音频,我希望用户能够擦除音频。

我见过其他帖子

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

但是dataWithContentsOfURL:是同步的,会阻塞主线程而不是流式传输,而不是我想要的。

理想情况下,我正在寻找一些方法,可以在接收数据时访问数据字节,将它们存储在缓冲区中,然后在某些时候(不一定是立即)播放可能不完整的缓冲区,同时我得到剩下的数据

我不确定如果有一种方法可以使用AVPlayer,或者我需要查看Core Audio等。

有人可以向我发送正确的方向吗?

2 个答案:

答案 0 :(得分:0)

以下是Apple提供的示例如何接收流并解析它。

Apple example

audioFileStreamParser Reference

答案 1 :(得分: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");

        }
    }
}