使用AVPlayer流式播放mp3音频

der*_*ahc 25 iphone objective-c audio-streaming ios

我听到一些有关此事的相互矛盾的报道.我想要做的是从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
Run Code Online (Sandbox Code Playgroud)

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

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

Sum*_*dra 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

    }
Run Code Online (Sandbox Code Playgroud)

  • 这里的区别是`AVPlayer`能够在'AVAudioPlayer`不能的地方流式传输.令人困惑的差异! (4认同)

tum*_*tum 15

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

https://github.com/tumtumtum/audjustable.