1.引言
假如你现在打算做一个类似百度音乐、豆瓣电台的在线音乐类APP,你会怎样做?
首先了解一下音频播放的实现级别:(1) 离线播放:这里并不是指应用不联网,而是指播放本地音频文件,包括先下完完成音频文件再进行播放的情况,这种使用AVFoundation里的AVAudioPlayer可以满足(2) 在线播放:使用AVFoundation的AVPlayer可以满足(3) 在线播放同时存储文件:使用AudioFileStreamer + AudioQueue 可以满足(4) 在线播放且带有音效处理:使用AudioFileStreamer + AudioQueue + 音效模块(系统自带或者自行开发)来满足
本文主要针对第二种级别,介绍如何使用AVPlayer实现网络音乐的播放。
2.什么是AVPlayer
AVPlayer存在于AVFoundation中,其实它是一个视频播放器,但是用它来播放音乐是没问题的,当然播放音乐不需要呈现界面,因此我们不需要实现它的界面。
跟AVPlayer联系密切的名词:Asset:AVAsset是抽象类,不能直接使用,其子类AVURLAsset可以根据URL生成包含媒体信息的Asset对象。AVPlayerItem:和媒体资源存在对应关系,管理媒体资源的信息和状态。
3.功能需求
通常音乐播放并展示到界面上需要我们实现的功能如下:1、(核心)播放器通过一个网络链接播放音乐2、(基本)播放器的常用操作:暂停、播放、上一首、下一首等等3、(基本)监听该音乐的播放进度、获取音乐的总时间、当前播放时间4、(基本)监听改播放器状态: (1)媒体加载状态 (2)数据缓冲状态 (3)播放完毕状态5、(可选)Remote Control控制音乐的播放6、(可选)Now Playing Center展示正在播放的音乐
4.功能实现
4.1通过一个网络链接播放音乐
NSURL * url = [NSURL URLWithString:self.currentSong.url];
AVPlayerItem * songItem = [[AVPlayerItem alloc]initWithURL:url];
AVPlayer * player = [[AVPlayer alloc]initWithPlayerItem:songItem];复制代码
这里是用一个asset来初始化player,当然你也可以直接用URL初始化:
AVPlayer * player = [[AVPlayer alloc] initWithURL:url];复制代码
需要获取当前播放的item可以这样获取:
AVPlayerItem * songItem = player.currentItem;复制代码
4.2播放器的常用操作
播放:
[player play];复制代码
需要注意的是初始化完player之后不一定会马上开始播放,需要等待player的状态变为ReadyToPlay才会进行播放。
暂停:
[player pause];复制代码
上一首、下一首:这里我们有两种方式可以实现,一种是由你自行控制下一首歌曲的item,