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音乐,酷狗,虾米,天天基本上霸占了所有的用户群体,不过并没有妨碍大家对音乐的 ...
随机推荐
- iOS 进阶 第二十一天(0531)
0531 - Autolayout 不仅可以做屏幕适配还可以做系统适配 uidynamic 做物理动画.能做的效果如下图: Autolayout Autolayout 是一种“自动布局”技术,专门用来 ...
- typings的理解
简介一些js库扩展了JavaScript的特性和语法,但是TypeScript编译器并不识别,通过typings.json配置可以辅助IDE,给出有智能的提示信息,以及重构的依据.因此需要在typin ...
- 替换APK中的jar包文件
[Qboy] 2014年12月21日 这几天,我第一次做的android游戏(WE!青春纪)马上就要上线.上线之前需要把各个渠道的SDK加入到我们游戏中,与渠道进行联运.但是商务很给力,一下子联系了1 ...
- Android开发随笔4
昨天: 今天: 编写代码
- 团队项目NABC分析
我们的团队项目是“来用”实用工具集合软件,我针对我们项目功能丰富的特点进行NABC分析. N (Need 需求):我们的软件正是从最大程度上满足用户需求出发,因为软件集合了不同种类的功能,可以满足用户 ...
- javascript权威指南第六版学习
第二章 语法结构 2.1 字符集 什么是字符集?各种字符集什么关系?unicode,utf-8是什么关系? 字符(Character)是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等 ...
- JS获取字符串长度(英文占1个字符,中文汉字占2个字符)
方法一: String.prototype.gblen = function() { var len = 0; for (var i = 0; i < this.length; i++) { i ...
- Jquery $.getJSON()设置同步
如下: $.ajaxSettings.async = false; $.getJSON('/AjaxSwitchDynamicInfo/GetPortUsedCount.cspx', { switch ...
- apache与tomcat负载集群的3种方法
花了两天时间学习apache与tomcat的集成方法,现在把学习成果记录下来. apache与tomcat负载集群集成方法有3种jk.jk_proxy.http_proxy 本次集成使用的软件版本: ...
- android 开发 system/app目录下面有多个重复包名的apk,会不会冲突
环境:已经拥有了root权限的android系统,我们的apk是开机启动 测试:将2个相同的版本拷贝到系统system/app目录下面 adb root #获取root权限,前提是已经开放了root权 ...