ios怎么手机人脸识别解锁软件本机播放的音乐

iOS实现播放远程网络音乐的核心技术点总结
&更新时间:日 11:41:41 & 作者:夜_阑珊
本篇文章主要介绍了iOS播放远程网络音乐的核心技术,采用ios系统自带的AVFoundation框架来实现,有需要的朋友可以了解一下。
这两天做了个小项目涉及到了远程音乐播放,因为第一次做这种音乐项目,边查资料边做,其中涉及到主要技术点有:
如何播放远程网络音乐
如何切换当前正在播放中的音乐资源
如何监听音乐播放的各种状态(播放器状态、播放的进度、缓冲的进度,播放完成)
如何手动操控播放进度
如何在后台模式或者锁屏情况下正常播放音乐
如何在锁屏模式下显示音乐播放信息和远程操控音乐
如果您对一块技术点有兴趣或者正在寻找相关资料,那么本篇或许能提供一些参考或启发。
二、 网络音乐播放的核心技术点
根据自己的经验和查了一些音乐播放的相关资料,最简单和最易上手的的技术方案我想应该是采用ios系统自带的AVFoundation框架。
我们知道AVFoundation框架是苹果专门为多媒体打造的一个库,这个库非常强大,专门用来处理音视频等复杂的多媒体技术,而本篇要讲的所有技术点就是基于AVFoundation框架中的一个类——AVPlayer。
那么AVPlayer是什么?
你可以把他看成是一个已经封装好的播放器,它的作用是用来播放远程的或本地的视频和音频。因为本地的音视频的播放比较简单,这里就不做讲述,本编主要是讲远程音乐播放,因为都是基于AVPlayer同一套API,所以掌握远程音乐播放其实就是相当于掌握远程视频播放。好了废话就不多说了,下面开始上菜。
1、导入AVFoundation框架,创建AVPlayer播放器
-(AVPlayer *)player
if (_player == nil) {
// AVPlayerItem是一个包装音乐资源的类,初始化时可以传入一个音乐的url
AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:@"http://xxxxxxxx"]];
//通过AVPlayerItem初始化player
_player = [[AVPlayer alloc] initWithPlayerItem:item];
此处懒加载创建,让播放器成为控制器的全局属性,注意需要强引用,否则回收释放掉了就无法播放。
2、播放或停止音乐
//开始播放
[self.player play];
//停止播放
[self.player pause];
这个没什么好讲的,只要调用AVPlayer的两个实例方法
3、切换当前正在播放中的音乐资源
//创建需要播放的AVPlayerItem
AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:model.url]];
//替换当前音乐资源
[self.player replaceCurrentItemWithPlayerItem:item];
这个可以用于歌曲的切换,如上一首、下一首。
4、通过KVO监听播放器的状态
[self.player.currentItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
拿到播放器的currentItem,注册当前对象为观察者,监听它的status属性。status属性是AVPlayerItemStatus类型,它是一个枚举类型,如下:
typedef NS_ENUM(NSInteger, AVPlayerItemStatus) {
AVPlayerItemStatusUnknown,//未知状态
AVPlayerItemStatusReadyToPlay,//准备播放
AVPlayerItemStatusFailed//加载失败
当status属性值发生改变时,就会触发观察者方法的回调,如下:
//观察者回调
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary&NSKeyValueChangeKey,id& *)change context:(void *)context
//注意这里查看的是self.player.status属性
if ([keyPath isEqualToString:@"status"]) {
switch (self.player.status) {
case AVPlayerStatusUnknown:
NSLog(@"未知转态");
case AVPlayerStatusReadyToPlay:
NSLog(@"准备播放");
case AVPlayerStatusFailed:
NSLog(@"加载失败");
当 self.player.status ==& AVPlayerStatusReadyToPlay时,音乐就会开始正常播放,另外两种状态音乐是无法播放的,可以在上面方法相应状态里给出提示。这里需要特别强调一点的是观察者监听的对象是 self.player.currentItem,而不是 self.player,而当监听的属性发生改变时,观察者回调的方法里需要查看的是 self.player.status。当然,你也可以不这么干,但是我尝试过好几次,不这么干的后果是无法监听到 self.player.status属性的改变。
当音乐播放完成,或者切换下一首歌曲时,请务必记得移除观察者,否则会crash。操作如下:
//移除观察者
[self.player.currentItem removeObserver:self forKeyPath:@"status"];
5、监听音乐的缓冲进度
这个也是通过KVO监听播放器当前播放的音乐资源AVPlayerItem的loadedTimeRanges属性。我们先看监听,如下:
//KVO监听音乐缓冲状态
[self.player.currentItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];
当 loadedTimeRanges属性发生改变时,回调如下:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary&NSKeyValueChangeKey,id& *)change context:(void *)context
if ([keyPath isEqualToString:@"loadedTimeRanges"]) {
NSArray * timeRanges = self.player.currentItem.loadedTimeR
//本次缓冲的时间范围
CMTimeRange timeRange = [timeRanges.firstObject CMTimeRangeValue];
//缓冲总长度
NSTimeInterval totalLoadTime = CMTimeGetSeconds(timeRange.start) + CMTimeGetSeconds(timeRange.duration);
//音乐的总时间
NSTimeInterval duration = CMTimeGetSeconds(self.player.currentItem.duration);
//计算缓冲百分比例
NSTimeInterval scale = totalLoadTime/
//更新缓冲进度条
self.loadTimeProgress.progress =
loadedTimeRanges这个属性是一个数组,里面装的是本次缓冲的时间范围,这个范围是用一个结构体 CMTimeRange表示,当然在oc中结构体是不能直接存放数组的,所以它被包装成了oc对象 NSValue。
我们来看下这个结构体:
typedef struct
start表示本次缓冲时间的起点,duratin表示本次缓冲持续的时间范围,具体详细的计算方法可以看上面方法的实现。
当音乐播放完成,或者切换下一首歌曲时,请务必记得移除观察者,否则会crash。操作如下:
[self.player.currentItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];
6、监听音乐播放的进度
这个不是通过KVO了,AVPlayer专门提供了下面这个api用来监听播放的进度:
监听音乐播放进度
@param interval 监听的时间间隔,用来设置多长时间回调一次
@param queue
队列,一般传主队列
@param block
回调的block,会把当前的播放时间传递过来
@return 监听的对象
- (id)addPeriodicTimeObserverForInterval:(CMTime)interval queue:(nullable dispatch_queue_t)queue usingBlock:(void (^)(CMTime time))
操作如下:
__weak typeof(self) weakSelf =
self.timeObserver = [self.player addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
//当前播放的时间
float current = CMTimeGetSeconds(time);
float total = CMTimeGetSeconds(item.duration);
if (current) {
float progress = current /
//更新播放进度条
weakSelf.playSlider.value =
weakSelf.currentTime.text = [weakSelf timeFormatted:current];
我们可以这个block里面拿到当前播放时间,根据总时间计算出当前播放所占的时间比例,最后更新播放进度条。这里又涉及到了一个数据类类型CMTime,它也是一个结构体,用来作为时间的格式,定义如下:
typedef struct
CMTime是以分数的形式表示时间,value表示分子,timescale表示分母,flags是位掩码,表示时间的指定状态。所以我们要获得时间的秒数需要分子除以分母。当然你还可以用下面这个函数来获取时间的秒数:
Float64 CMTimeGetSeconds(CMTime time)
最后,当音乐播放完成或者切换音乐时,依然需要移除监听:
if (self.timeObserver) {
[self.player removeTimeObserver:self.timeObserver];
self.timeObserver =
7、手动超控(移动滑块)播放进度
这是一个播放音视频很常见的功能,所以强大的AVPlayer理所当然的提供了几个api,下面只讲述其中最简单的一个:
定位播放时间
@param time 指定的播放时间
- (void)seekToTime:(CMTime)
具体使用如下:
//移动滑块调整播放进度
- (IBAction)playSliderValueChange:(UISlider *)sender
//根据值计算时间
float time = sender.value * CMTimeGetSeconds(self.player.currentItem.duration);
//跳转到当前指定时间
[self.player seekToTime:CMTimeMake(time, 1)];
8、监听音乐播放完成
一般音视频播放完成时我们或多或少的都要处理一些业务,比如循环播放,播完退出界面等等。下面看下如何监听AVPlayer的播放完成。
//给AVPlayerItem添加播放完成通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:_player.currentItem];
这里是采用注册监听AVPlayerItemDidPlayToEndTimeNotification通知,当AVPlayer一播放完成时,便会发出这个通知,我们收到通知后进行处理即可
9、设置音乐后台播放
我们知道运行在ios系统下的程序一旦进入后台就会处于休眠状态,程序停止运行了,也就播放不了什么音乐了。但是有一些特定功能的app还是处于可以后台运行的,比如音乐类型的app正处于这个范畴。但是,并不是说你在应用中播放音乐就能后台高枕无忧的运行了,你依然需要做如下几步操作:
(1)开启后台模式
target -&capabilities-& Background modes -&打开开关 -&勾选第一个选项
(2)程序启动时设置音频会话
//一般在方法:application: didFinishLaunchingWithOptions:设置
//获取音频会话
AVAudioSession *session = [AVAudioSession sharedInstance];
//设置类型是播放。
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
//激活音频会话。
[session setActive:YES error:nil];
以上两步设置无误,程序进入后台模式,便可以进行音乐播放
10、如何设置音乐锁频信息
我们看百度音乐锁频时,也依然能在屏幕上展示歌曲的信息,以及切换歌曲等。下面看看这个功能是如何实现的:
//音乐锁屏信息展示
- (void)setupLockScreenInfo
// 1.获取锁屏中心
MPNowPlayingInfoCenter *playingInfoCenter = [MPNowPlayingInfoCenter defaultCenter];
//初始化一个存放音乐信息的字典
NSMutableDictionary *playingInfoDict = [NSMutableDictionary dictionary];
// 2、设置歌曲名
if (self.currentModel.name) {
[playingInfoDict setObject:self.currentModel.name forKey:MPMediaItemPropertyAlbumTitle];
// 设置歌手名
if (self.currentModel.artist) {
[playingInfoDict setObject:self.currentModel.artist forKey:MPMediaItemPropertyArtist];
// 3设置封面的图片
UIImage *image = [self getMusicImageWithMusicId:self.currentModel];
if (image) {
MPMediaItemArtwork *artwork = [[MPMediaItemArtwork alloc] initWithImage:image];
[playingInfoDict setObject:artwork forKey:MPMediaItemPropertyArtwork];
// 4设置歌曲的总时长
[playingInfoDict setObject:self.currentModel.detailDuration forKey:MPMediaItemPropertyPlaybackDuration];
//音乐信息赋值给获取锁屏中心的nowPlayingInfo属性
playingInfoCenter.nowPlayingInfo = playingInfoD
// 5.开启远程交互,只有开启这个才能进行远程操控
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
这里设置图片时需要注意下,异步加载网络图片后再设置是无效的,所以图片信息最好是先请求下来后再进行设置。
远程超控的回调如下:
//监听远程交互方法
- (void)remoteControlReceivedWithEvent:(UIEvent *)event
switch (event.subtype) {
case UIEventSubtypeRemoteControlPlay:{
[self.player play];
case UIEventSubtypeRemoteControlPause:{
[self.player pause];
case UIEventSubtypeRemoteControlNextTrack:
[self nextBtnAction:nil];
case UIEventSubtypeRemoteControlPreviousTrack:
[self lastBtnAction:nil];
最后,画了一张图总结下播放远程网络音乐的流程:
根据QQ音乐的界面做了个小demo,下面是demo的真机前台和后台播放的运行效果:
四、结束语
播放远程网络音乐的核心技术点基本上已经写完,当然AVPlayer还有很多强大的功能没有写出来,有兴趣的可以进一步挖掘。写到这里已经疲倦至极,后续会持续更新一些精彩的技术点,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具iOS如何播放在文件夹里面存放的音乐呢?_百度知道
iOS如何播放在文件夹里面存放的音乐呢?
我想知道怎么才能实现播放在文件夹里面存放的音乐,谁能告诉我么?...
我想知道怎么才能实现播放在文件夹里面存放的音乐,谁能告诉我么?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
假如_莫名_
假如_莫名_
iOS系统会自动识别文件夹中的音乐格式文件,首先你要将音乐文件导入到IOS中,导入步骤:1.下载并安装iTunes2.连接IOS设备至电脑,并打开iTunes3.点击菜单,选择“将文件添加到资料库”4.选择好你需要导入的音乐后点击打开,音乐就会导入5.点击IOS设备标识,跳转到自己IOS设备界面6.选择“音乐”,勾选“同步音乐”注意:所有操作完毕后不要忘记点击“应用”点击“复原”会撤销所有操作
采纳数:4488
获赞数:30984
你不会还在用诺基亚的吧,安卓和IOS的都能自动识别音乐文件夹的,诺基亚的要放在sound里面。希望采纳
本回答被网友采纳
采纳数:335
获赞数:7855
哪个文件夹?貌似IOS没有文件夹开放功能吧,IOS本来就是封闭的,你把音乐放到ipod里面不就能播放了
矛盾的萝卜
矛盾的萝卜
采纳数:23
获赞数:124
苹果手机 吧。我很纳闷你是怎么放在文件夹里的。用的是类似于无线u盘的软件吗?越狱过的可以下载一个播放器试一下。因为都带扫描功能的。手机自带的是没法播放反正。
59爱情麻辣烫
59爱情麻辣烫
采纳数:16
获赞数:3470
擅长:暂未定制
安卓和IOS的都能自动识别音乐文件夹的,诺基亚的要放在sound里面。
NSFileManager *fileManage = [NSFileManager defaultManager]; NSMutableString *stringname = [[NSMutableString alloc] init]; [stringname appendString:apath]; NSString *path = [[NSBundle mainBundle] bundlePath]; path = [path stringByAppendingPathComponent:@&TEST&]; path = [path stringByAppendingPathComponent:stringname]; [stringname release]; NSArray *files = [fileManage subpathsAtPath:path];
其他3条回答
为你推荐:
其他类似问题
您可能关注的内容
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。[系统] iPhone自带的音乐在手机上怎么添加歌曲? - iOS圈 - IT圈极客微软苹果资源搜索[系统] iPhone自带的音乐在手机上怎么添加歌曲?Lv.26Lv.0Lv.26Lv.0Lv.16Lv.26Lv.16Lv.33Lv.26Lv.33Lv.26Lv.33Lv.33Lv.26Lv.23Lv.26Lv.23Lv.26Lv.23Lv.26Lv.0Lv.26Lv.42Lv.42Lv.17Lv.17Lv.24Lv.32Lv.33Lv.19Lv.26Lv.28iOS圈周榜IT圈 -,旗下,鲁ICP备号ios开发中,怎么将本地音乐文件和沙盒中的音乐文件在一个播放器中播放?
[问题点数:40分,结帖人jasonsaw]
本版专家分:0
结帖率 88.89%
CSDN今日推荐
本版专家分:0
本版专家分:1391
2013年12月 移动开发大版内专家分月排行榜第三
本版专家分:0
本版专家分:0
本版专家分:1391
2013年12月 移动开发大版内专家分月排行榜第三
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:1391
2013年12月 移动开发大版内专家分月排行榜第三
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
匿名用户不能发表回复!
其他相关推荐鏈?笘鏈

我要回帖

更多关于 识别本机音乐 的文章

 

随机推荐