25

我听到一些关于此的相互矛盾的报告。我要做的是从 URL 流式传输 mp3 文件。我已经进行了数小时的研究,但我找不到任何关于如何做到这一点的好的指南,甚至找不到我应该使用哪种音频播放器。

有些朋友告诉我,AVPlayer 可以串流 mp3,但苹果文档说不能。我已经倾注了 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

我需要做的就是抓住它并开始播放,并且能够暂停和擦洗。所以首先,可以 AVPlayer 流 mp3 吗?如果是这样,是否有人可以指出我的任何指南或代码?如果没有,是否有任何可以流式传输音频的音频播放器类?

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

4

5 回答 5

66

试试这个

 -(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

    }
于 2012-10-31T11:32:08.617 回答
15

你也可以试试我的支持 HTTP 流的开源可调节库。它基于 Matt 的 AudioStreamer,但经过整理、优化和更新以支持多个数据源(非 HTTP)和无缝播放。

https://github.com/tumtumtum/audjustable

于 2013-06-07T12:29:53.073 回答
2

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

这是我找到该信息的地方:http: //www.soundabout.net/streammp3.htm

于 2013-11-05T14:29:58.100 回答
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 对象的。

于 2012-11-01T21:55:46.870 回答
0

Aaron 关于使用 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
于 2019-08-15T21:55:40.583 回答