使用AVPlayer流式播放mp3音频

时间:2012-10-29 23:33:03

标签: iphone objective-c ios audio-streaming

我听到一些有关此事的相互矛盾的报道。我想要做的是从URL流式传输mp3文件。我做了几个小时的研究,但是我找不到任何关于如何做到这一点的好指南,甚至找不到我应该使用什么样的音频播放器。

有些朋友告诉我AVPlayer可以流式播放mp3,但Apple文档说它不能。我已经倾倒了Matt Gallagher的音频流(http://www.cocoawithlove.com/2008/09/streaming-and-playing-live-mp3-stream.html),但这段代码很久以前就已经发布了,我对此很新,很难通过自动释放和保留以及所有这些。

我正在尝试流式传输的音频是一个来自libsyn服务器的相当大的mp3文件,其格式为URL。

http://traffic.libsyn.com/podcastname/episode.mp3

我需要做的就是抓住并开始游戏,能够暂停和擦洗。首先,CAN AVPlayer流MP3是什么?如果是这样,是否有人可以指向我的任何指南或代码?如果没有,是否有任何类型的音频播放器类可以传输音频?

我尝试创建一个AVPlayerItem,用URL初始化,然后将其添加到AVPlayer,但是我收到了大量错误加载...和符号未找到...错误。我很感激有关这方面的任何信息,谢谢!

5 个答案:

答案 0 :(得分:65)

试试这个

 -(void)playselectedsong{

        AVPlayer *player = [[AVPlayer alloc]initWithURL:[NSURL URLWithString:urlString]];
        self.songPlayer = player;
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(playerItemDidReachEnd:)
                                                     name:AVPlayerItemDidPlayToEndTimeNotification
                                                   object:[songPlayer currentItem]];
        [self.songPlayer addObserver:self forKeyPath:@"status" options:0 context:nil];
        [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateProgress:) userInfo:nil repeats:YES];



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

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

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


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

            }
        }
    }

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

     //  code here to play next sound file

    }

答案 1 :(得分:14)

您还可以尝试我的支持HTTP流的开源Audjustable库。它基于Matt的AudioStreamer,但已经过整理,优化和更新,以支持多种数据源(非HTTP)和无间隙播放。

https://github.com/tumtumtum/audjustable

答案 2 :(得分:2)

除了Sumit Mundra的答案,这对我帮助很大,我发现这种技术实际上并没有从远程服务器流式传输 MP3文件。当我实现这个时,文件在播放之前同步下载,阻止我的UI。正确传输我发现的MP3效果非常好的方法是指向M3U文件。这只是一个扩展名为.m3u的文本文件,其中包含原始MP3的链接。相反,在该文件中指向Sumit的代码,并且您有一个立即开始播放的流。

这是我发现信息的地方:http://www.soundabout.net/streammp3.htm

答案 3 :(得分:0)

Matt Gallagher的AudioStreamer在2个月前更新https://github.com/mattgallagher/AudioStreamer/commits/master

但是对于您要查找的内容,请查看示例代码StichedStreamPlayer http://developer.apple.com/library/ios/#samplecode/StitchedStreamPlayer/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010092

它使用AVPlayer对象,如果你看方法 - (IBAction)loadMovieButtonPressed:(id)sender你应该能够按照它设置AVPlayer对象的方式。

答案 4 :(得分:0)

亚伦有关使用m3u文件而不是mp3的帖子对我有用。我还发现AVPlayer对m3u语法很挑剔。例如,当我尝试以下操作时,我无法获得有效的持续时间(始终是不确定的),并且相对路径无效:

#EXTM3U
#EXTINF:71
https://test-domain.com/90c9a240-51b3-11e9-bb69-c1300ce2348f.mp3

但是,将m3u文件更新为以下文件后,两个问题均已解决:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:70
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:70.000,
8577d650-51b3-11e9-8e69-4f2b085e94aa.mp3
#EXT-X-ENDLIST