iOS在线音乐播放SZKAVPlayer(基于AVPlayer的封装)
由于最近闲着没事,想找有关在线音乐播放的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;
最终效果图:

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
原文链接:http://www.jianshu.com/p/4e0ac2898de0
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
iOS在线音乐播放SZKAVPlayer(基于AVPlayer的封装)的更多相关文章
- Android 4.3实现类似iOS在音乐播放过程中如果有来电则音乐声音渐小铃声渐大的效果
目前Android的实现是:有来电时,音乐声音直接停止,铃声直接直接使用设置的铃声音量进行铃声播放. Android 4.3实现类似iOS在音乐播放过程中如果有来电则音乐声音渐小铃声渐大的效果. 如果 ...
- Andriod小项目——在线音乐播放器
转载自: http://blog.csdn.net/sunkes/article/details/51189189 Andriod小项目——在线音乐播放器 Android在线音乐播放器 从大一开始就已 ...
- 在线音乐播放器-----酷狗音乐api接口抓取
首先身为一个在线音乐播放器,需要前端和数据库的搭配使用. 在数据库方面,我们没有办法制作,首先是版权问题,再加上数据量.所以我们需要借用其他网络播放器的数据库. 但是这些在线播放器,如百度,酷狗,酷我 ...
- python 开发在线音乐播放器-简易版
在线音乐播放器,使用python的Tkinter库做了一个界面,感觉这个库使用起来还是挺方便的,音乐的数据来自网易云音乐的一个接口,通过urllib.urlopen模块打开网址,使用Json模块进行数 ...
- Flex4/Flash开发在线音乐播放器 , 含演示地址
要求 必备知识 本文要求基本了解 Adobe Flex编程知识和JAVA基础知识. 开发环境 MyEclipse10/Flash Builder4.6/Flash Player11及以上 演示地址 演 ...
- ios 视频音乐播放
IOS开发小技巧(视频和音乐播放).IOS视频播放代码(添加MediaPlayer.framework和#import) -(void)playMovie:(NSString *)fileName{ ...
- iOS开发-音乐播放
现在的各种App大行其道,其实常用也就是围绕着吃喝玩乐基本的需求,视频,音乐在智能手机出现之前更是必不可少的功能,每个手机都会有一个自带的音乐播放器,当然公众也有自己的需求所以也就造就了各种音乐播放软 ...
- iOS 简单音乐播放器 界面搭建
如图搭建一个音乐播放器界面,具备以下几个简单功能: 1,界面协调,整洁. 2,点击播放,控制进度条. 3.三收藏歌曲,点击收藏,心形收藏标志颜色加深. 4,左右按钮,切换歌曲图片和标题. 5,点击中间 ...
- iOS开发-音乐播放(AVAudioPlayer)
现在的手机的基本上没有人不停音乐的,我们无法想象在一个没有声音的世界里我们会过的怎么样,国内现在的主流的主流网易云音乐,QQ音乐,酷狗,虾米,天天基本上霸占了所有的用户群体,不过并没有妨碍大家对音乐的 ...
随机推荐
- Nginx + django windows下配置
1.下载nginx, 去http://nginx.org/en/download.html 下载,我下载的是1.8 stable版本. 2.配置文件/conf/nginx.conf #user nob ...
- PB数据类型转换表
数据类型转换表 MICROSOFT PB(16Bit) PB(32Bit) Bool Boolean ...
- Java把内存划分为4个部分 1. 代码区 1、栈区 3、堆区 4、静态区域
1.栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源 2.堆区(heapsegment)—一般由程序员分配释放 ...
- 如何在github上fork一个项目来贡献代码以及同步原作者的修改
[-] 如何贡献自己的力量 如何让自己的项目与原作者的项目保持同步 作为一个IT人,通过github进行学习是最快的成长手 段.我们可以浏览别人的优秀代码.但只看不动手还是成长得很慢,因此为别人贡献代 ...
- cocos2dx中的CCLayerColor
颜色图层在游戏中主要用来烘托背景,可以按照RGB设置填充颜色,同时还可以设置图层的透明度(opacity),常用于显示背景 颜色图层还存在一个特殊的子类:CCLayerGradient,是具有颜色渐变 ...
- Capacity Scheduler 队列设置
先附一个官网地址 Capacity Scheduler是YARN中默认的资源调度器. 相关参数配置: 资源分配相关参数 ``` (1) capacity:队列的资源容量(百分比). 当系统非常繁忙时, ...
- 不会JS中的OOP,你也太菜了吧!(第一篇)
一.你必须知道的 1) 字面量 2) 原型 3) 原型链 4) 构造函数 5) 稳妥对象(没有公共属性,而且其方法也不引用this的对象.稳妥对象适合用在安全的环境中和防止数据被其它程序改变的时候) ...
- MYbatis调试日记(三)
如何在Mybatis中插入日期类型的数据 直接见代码: xml配置文件 java代码
- bzoj 1800 暴力枚举
直接暴力枚举四个点,然后判断是否能组成矩形就行了 注意枚举的点的标号从小到大,保证不重复枚举 /**************************************************** ...
- 【BZOJ】【2480】【SPOJ 3105】Mod
扩展BSGS Orz zyf……然而他的题解对AC大神的题解作了引用……而坑爹的百度云……呵呵了... 扩展BSGS模板题 /************************************* ...