由于最近闲着没事,想找有关在线音乐播放的demo学习一下,在gitHub跟code4APP上面查找了很多帖子,结果很多在线音乐都是基于AudioStream实现的,我感觉用起来不太方便。后来突然发现,AVFoundation框架中提供了一个AVPlayer可以用来实现在线音乐播放,特地学习了一下,封装成了SZKAVPlayer,与大家共享一下,笔者第一次写这些功能文档,如果有不足或者错误的地方,欢迎大家批评指正。废话不多说,直接上调用的代码:

在ViewController.m首先导入头文件,并挂上SZKAVPlayerDelegate代理

#import "SZKAVPlayer.h"

准备好相关的数据源

#pragma mark---歌曲名称数组
-(NSArray *)songNameArr
{
_songNameArr=@[@"火星情报局 (《火星情报局》节目主题曲)",@"下一站我是你的依靠",@"世界上不存在的歌(《火锅英雄》电影主题曲)"];
return _songNameArr;
}
#pragma mark---歌曲流媒体地址
-(NSArray *)songArr
{
_songArr=@[@"http://ws.stream.qqmusic.qq.com/105857360.m4a?fromtag=46",@"http://ws.stream.qqmusic.qq.com/105772207.m4a?fromtag=46",@"http://ws.stream.qqmusic.qq.com/105857409.m4a?fromtag=46"];
return _songArr;
}
#pragma mark---歌曲演唱者数组
-(NSArray *)songAuthorArr
{
_songAuthorArr=@[@"华晨宇",@"金志文",@"赵英俊"];
return _songAuthorArr;
}
#pragma mark---歌曲图片的数组
-(NSArray *)songImageArr
{
_songImageArr=@[@"http://i.gtimg.cn/music/photo/mid_album_300/W/8/003re5702kSBW8.jpg",@"http://i.gtimg.cn/music/photo/mid_album_300/z/9/002PnERL0JwJz9.jpg",@"photo3.jpg"];
return _songImageArr;
}

初始化player时传入歌曲的网址数组跟歌曲的背景图片数组便可实现当前歌曲播放结束后,自动播放下一首并切换player的背景图片(支持本地图片和网络图片)

- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor=[UIColor colorWithWhite:0.875 alpha:1.000];
//添加playerView
[self addPlayerView];
}
#pragma mark---添加playerView
-(void)addPlayerView
{
_player=[[SZKAVPlayer alloc]initWithFrame:CGRectMake(WIDTH/4, HEIGHT/2-WIDTH/4, WIDTH/2, WIDTH/2) andSongUrlArr:self.songArr andSongImageArr:self.songImageArr];
_player.delegate=self;
_player.layer.cornerRadius=WIDTH/4;
_player.layer.masksToBounds=YES;
_player.backgroundColor=[UIColor yellowColor];
//设置volume,不设置默认为0.5
_player.volume=0.8;
[self.view addSubview:_player];
}

实现代理方法可自动返回当前时间,总共时间,歌曲进度以及点击次数,并且时间的格式已经转换成00:00的格式

#pragma mark----SZKAVPlayerDelegate代理方法
-(void)getSongCurrentTime:(NSString *)currentTime andTotalTime:(NSString *)totalTime andProgress:(CGFloat)progress andTapCount:(NSInteger)tapCount
{
//进度条
[_progressView setProgress:progress];
//歌曲时间
_songTime.text=[NSString stringWithFormat:@"%@/%@",currentTime,totalTime];
//歌曲名称
_songName.text=self.songNameArr[tapCount];
//歌曲演唱者
_songAuthor.text=self.songAuthorArr[tapCount];
}

player的其他操作调用SZKAVPlayer.h中相关的API即可

/**
* 开始播放
*/
-(void)startPlay;
/**
* 暂停播放
*/
-(void)puasePlay;
/**
* 播放下一首
*/
-(void)nextSong;
/**
* 播放上一首
*/
-(void)lastSong;

最终效果图:

046379CE-59E9-4F04-8211-FE8D8B9AF388.png

SZKAVPlayer的调用方法大致就是这样,只需要在初始化时传入歌曲数组和歌曲图片,便可实现当前歌曲结束后,自动播放下一首,同时切换歌曲图片,并且代理方法中的歌曲的当前时间,总共时间以及播放进度,也会随着歌曲的切换而自动刷新。

下面大致介绍一下SZKAVPlayer.m的实现方法
songItem和player用来初始化SZKAVPlayer

//初始化songItem和player
_songItem=[AVPlayerItem playerItemWithURL:url];
_player=[AVPlayer playerWithPlayerItem:_songItem];
[_player play];

并对播放器添加了三个监听和一个通知

#pragma mark----监听播放器的加载状态
-(void)addAVPlayerStatusObserver
{
[_songItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
}
#pragma mark----数据缓冲状态的监听
-(void)addNetDataStatusObserver
{
[_songItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];
}
#pragma mark----添加观察者监听获取当前时间,总共时间,进度
-(void)addTimeObserve
{
__block AVPlayerItem *songItem=_songItem;
__block typeof(self) bself = self;
_timeObserver=[_player addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
//设置player的声音
[bself setPlayerVolume];
//添加背景图片
NSString *imagrStr=bself.imageArr[bself.tapCount];
if (imagrStr.length<=4) {
bself.playerImage.image=[UIImage imageNamed:bself.imageArr[bself.tapCount]];
}else{
NSString *imagrSubStr=[imagrStr substringWithRange:NSMakeRange(0, 4)];
if ([imagrSubStr isEqualToString:@"http"]) {
NSURL *imageUrl=[NSURL URLWithString:bself.imageArr[bself.tapCount]];
[bself.playerImage setImageWithURL:imageUrl placeholderImage:[UIImage imageNamed:@"radioBG"]];
}else{
bself.playerImage.image=[UIImage imageNamed:bself.imageArr[bself.tapCount]];
}
}
//当前时间
float current=CMTimeGetSeconds(time);
//总共时间
float total=CMTimeGetSeconds(songItem.duration);
//进度
float progress=current/total;
//将值传入知道delegate方法中
[bself.delegate getSongCurrentTime:[bself formatTime:current] andTotalTime:[bself formatTime:total] andProgress:progress andTapCount:bself.tapCount];
}];
}
#pragma mark----播放完成后发送通知
-(void)addPlayToEndObserver
{
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(playFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:_songItem];
}

为了防止在进行下一首歌曲时候监听出错,在当前歌曲结束后移除所有监听,在下一首歌曲播放前再次添加监听,笔者亲测目前这样写没有出现什么问题。

大致的功能原理先写到这,笔者第一次写,不足的地方还望各位读者见谅,如果遇到什么问题,可以评论回复,笔者收到后第一时间回复大家,也可以添加笔者的QQ/微信:790057066 ,并且刚刚把demo上传到了GitHub上面感兴趣的朋友,可以上去下载查看,记得star下,非常感谢。

SZKAVPlayer链接 https://github.com/18811314750/SZKAVPlayer

笔者的其他文章
iOS开发-利用命令行实现将本地代码上传到GitHub
http://www.jianshu.com/p/79b94add9057

iOS开发-快速调用照相机和相册,并实现沙盒中照片的保存与读取
http://www.jianshu.com/p/7ffc8844e956

文/iOS_凯(简书作者)
原文链接:http://www.jianshu.com/p/4e0ac2898de0
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

iOS在线音乐播放SZKAVPlayer(基于AVPlayer的封装)的更多相关文章

  1. Android 4.3实现类似iOS在音乐播放过程中如果有来电则音乐声音渐小铃声渐大的效果

    目前Android的实现是:有来电时,音乐声音直接停止,铃声直接直接使用设置的铃声音量进行铃声播放. Android 4.3实现类似iOS在音乐播放过程中如果有来电则音乐声音渐小铃声渐大的效果. 如果 ...

  2. Andriod小项目——在线音乐播放器

    转载自: http://blog.csdn.net/sunkes/article/details/51189189 Andriod小项目——在线音乐播放器 Android在线音乐播放器 从大一开始就已 ...

  3. 在线音乐播放器-----酷狗音乐api接口抓取

    首先身为一个在线音乐播放器,需要前端和数据库的搭配使用. 在数据库方面,我们没有办法制作,首先是版权问题,再加上数据量.所以我们需要借用其他网络播放器的数据库. 但是这些在线播放器,如百度,酷狗,酷我 ...

  4. python 开发在线音乐播放器-简易版

    在线音乐播放器,使用python的Tkinter库做了一个界面,感觉这个库使用起来还是挺方便的,音乐的数据来自网易云音乐的一个接口,通过urllib.urlopen模块打开网址,使用Json模块进行数 ...

  5. Flex4/Flash开发在线音乐播放器 , 含演示地址

    要求 必备知识 本文要求基本了解 Adobe Flex编程知识和JAVA基础知识. 开发环境 MyEclipse10/Flash Builder4.6/Flash Player11及以上 演示地址 演 ...

  6. ios 视频音乐播放

    IOS开发小技巧(视频和音乐播放).IOS视频播放代码(添加MediaPlayer.framework和#import) -(void)playMovie:(NSString *)fileName{ ...

  7. iOS开发-音乐播放

    现在的各种App大行其道,其实常用也就是围绕着吃喝玩乐基本的需求,视频,音乐在智能手机出现之前更是必不可少的功能,每个手机都会有一个自带的音乐播放器,当然公众也有自己的需求所以也就造就了各种音乐播放软 ...

  8. iOS 简单音乐播放器 界面搭建

    如图搭建一个音乐播放器界面,具备以下几个简单功能: 1,界面协调,整洁. 2,点击播放,控制进度条. 3.三收藏歌曲,点击收藏,心形收藏标志颜色加深. 4,左右按钮,切换歌曲图片和标题. 5,点击中间 ...

  9. iOS开发-音乐播放(AVAudioPlayer)

    现在的手机的基本上没有人不停音乐的,我们无法想象在一个没有声音的世界里我们会过的怎么样,国内现在的主流的主流网易云音乐,QQ音乐,酷狗,虾米,天天基本上霸占了所有的用户群体,不过并没有妨碍大家对音乐的 ...

随机推荐

  1. P1643: [Usaco2007 Oct]Bessie's Secret Pasture 贝茜的秘密草坪

    呵呵呵呵呵,很水的DP,同时能够朴素枚举出来,这数据弱的 是 吃了尸米吧.. var n,i,j,k,l,ans:longint; begin readln(n); to trunc(sqrt(n)) ...

  2. unity工具IGamesTools之批量生成帧动画

    unity工具IGamesTools批量生成帧动画,可批量的将指定文件夹下的帧动画图片自动生成对应的资源文件(Animation,AnimationController,Prefabs) unity工 ...

  3. Indigo Studio

    http://www.infragistics.com/products/indigo-studio?gclid=CIXrnav4lcQCFdclvQoduVEAnA

  4. js判断浏览器滚动条是否拉到底

    $(window).scroll(function(){ // 当滚动到最底部以上n像素时, 加载新内容 if ($(document).height() - $(this).scrollTop() ...

  5. 使用Ninject+Moq在单元测试中抽象数据访问层

    一.测试方法的业务逻辑时,通常都需要从数据库读取测试数据,但是每次初始化数据库数据都很麻烦,也会影响到其它业务对数据的访问,怎样抽象数据访问层呢?就是用Moq去模拟数据访问的逻辑     二.步骤如下 ...

  6. bzoj 2956 数学展开,分段处理

    首先对于答案 ΣΣ(n mod i)*(m mod j) i<>j 也就是Σ(n mod i)Σ(m mod j)-Σ(n mod i)(m mod i) 将mod展开,我们可以得到有fl ...

  7. poj 2342 Anniversary party

    题目链接:http://poj.org/problem?id=2342 题意:读题很容易懂,这里不做介绍. 解法:树形DP之路的第一道题. #include<iostream> #incl ...

  8. Matlab实现单变量线性回归

    一.理论 二.数据集 6.1101,17.592 5.5277,9.1302 8.5186,13.662 7.0032,11.854 5.8598,6.8233 8.3829,11.886 7.476 ...

  9. Model-View-Controller - 杂谈

    经典的B/S结构+MVC模式:  注意:MVC层次均位于server中. 下面通过一个简单并且具体的例子来体会下这种MVC模式: --- 功能:查询所有图书:涉及到数据库,JSP,Servlet等 S ...

  10. Nodejs Express 4.X 中文API 1--- Application篇

    相关阅读: Express 4.X API 翻译[一] --  Application篇 Express4.XApi 翻译[二] --  Request篇 Express4.XApi 翻译[三] -- ...