iOS 流媒体 MP3 文件

Posted

技术标签:

【中文标题】iOS 流媒体 MP3 文件【英文标题】:iOS Streaming MP3 File 【发布时间】:2015-02-07 19:07:02 【问题描述】:

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

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

我看到其他帖子使用

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

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

理想情况下,我正在寻找某种方式,以便在收到数据字节时访问它们,将它们存储在缓冲区中,然后在获得其余部分时(不一定立即)播放可能不完整的缓冲区数据

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

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

【问题讨论】:

【参考方案1】:

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

Apple example

audioFileStreamParser Reference

【讨论】:

link 这是一个指南,如何解决使用 Apples 代码可能出现的一些问题以及如何通过音频进行搜索。【参考方案2】:

AVPlayer 支持蒸汽。 AVAudioPlayer 没有。

类似这样的 sn-p,假设您已经创建了一个名为 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");

        
    

【讨论】:

我一直在使用 AVPlayer,但是通过在运行我的应用程序时查看网络活动,看起来它会立即下载所有歌曲而不是流式传输。

以上是关于iOS 流媒体 MP3 文件的主要内容,如果未能解决你的问题,请参考以下文章

未处理的 IO 异常?使用媒体播放器播放 mp3 文件 - Android

iOS 流媒体 mp3

iOS多媒体总结

使用 ExtAudioFileWrite ios 将流式 mp3 数据包的缓冲区写入 wav 文件

媒体播放器文件未找到异常

单击 MP3 文件时打开媒体播放器