iOS 流媒体 MP3 文件

iOS Streaming MP3 File

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

我想在流式传输音频时播放它,并且我希望用户能够浏览音频。

我看到其他帖子使用

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

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

理想情况下,我正在寻找某种方法,以便在接收到数据字节时可以访问它们,将它们存储在缓冲区中,然后在我得到其余数据

我不确定是否有办法用 AVPlayer 做到这一点,或者我是否需要研究 Core Audio 等。

有人能告诉我正确的方向吗?

这里是苹果提供的接收流和解析流的例子。

Apple example

audioFileStreamParser Reference

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");

        }
    }
}