概述

功能描述:锁屏歌曲信息、控制台远程控制音乐播放:暂停/播放、上一首/下一首、快进/快退、列表菜单弹框和拖拽控制台的进度条调节进度(结合了QQ音乐和网易云音乐在锁屏状态下的效果)、歌词解析并随音乐滚动显示。

详细

代码下载:http://www.demodashi.com/demo/10754.html

功能描述:锁屏歌曲信息、控制台远程控制音乐播放:暂停/播放、上一首/下一首、快进/快退、列表菜单弹框和拖拽控制台的进度条调节进度(结合了QQ音乐和网易云音乐在锁屏状态下的效果)、歌词解析并随音乐滚动显示。

第一部分:锁屏效果包括:锁屏歌曲信息和远程控制音乐播放

① 锁屏歌曲信息显示

//展示锁屏歌曲信息:图片、歌词、进度、歌曲名、演唱者、专辑、(歌词是绘制在图片上的)
- (void)showLockScreenTotaltime:(float)totalTime andCurrentTime:(float)currentTime andLyricsPoster:(BOOL)isShow{   NSMutableDictionary * songDict = [[NSMutableDictionary alloc] init];    //设置歌曲题目[songDict setObject:@"多幸运" forKey:MPMediaItemPropertyTitle];    //设置歌手名[songDict setObject:@"韩安旭" forKey:MPMediaItemPropertyArtist];    //设置专辑名[songDict setObject:@"专辑名" forKey:MPMediaItemPropertyAlbumTitle];    //设置歌曲时长[songDict setObject:[NSNumber numberWithDouble:totalTime]  forKey:MPMediaItemPropertyPlaybackDuration];    //设置已经播放时长[songDict setObject:[NSNumber numberWithDouble:currentTime] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];   UIImage * lrcImage = [UIImage imageNamed:@"backgroundImage5.jpg"];    if (isShow) {             //制作带歌词的海报if (!_lrcImageView) {_lrcImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 480,800)];}      if (!_lockScreenTableView) {_lockScreenTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 800 - 44 * 7 + 20, 480, 44 * 3) style:UITableViewStyleGrouped];_lockScreenTableView.dataSource = self;_lockScreenTableView.delegate = self;_lockScreenTableView.separatorStyle = NO;_lockScreenTableView.backgroundColor = [UIColor clearColor];[_lockScreenTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cellID"];}        //主要为了把歌词绘制到图片上,已达到更新歌词的目的[_lrcImageView addSubview:self.lockScreenTableView];_lrcImageView.image = lrcImage;_lrcImageView.backgroundColor = [UIColor blackColor];        //获取添加了歌词数据的海报图片UIGraphicsBeginImageContextWithOptions(_lrcImageView.frame.size, NO, 0.0);     CGContextRef context = UIGraphicsGetCurrentContext();[_lrcImageView.layer renderInContext:context];lrcImage = UIGraphicsGetImageFromCurrentImageContext();_lastImage = lrcImage;     UIGraphicsEndImageContext();}else{       if (_lastImage) {lrcImage = _lastImage;}}    //设置显示的海报图片[songDict setObject:[[MPMediaItemArtwork alloc] initWithImage:lrcImage]forKey:MPMediaItemPropertyArtwork];   //加入正在播放媒体的信息中心[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:songDict];}

② 远程控制音乐播放

在此之前需先满足后台播放音乐的条件:

    //后台播放音频设置,需要在Capabilities->Background Modes中勾选Audio,Airplay,and Picture in Picture ,如下图1、2AVAudioSession *session = [AVAudioSession sharedInstance];[session setActive:YES error:nil];[session setCategory:AVAudioSessionCategoryPlayback error:nil];

  • 在iOS7.1之前, App如果需要在锁屏界面开启和监控远程控制事件,可以通过重写- (void)remoteControlReceivedWithEvent:(UIEvent *)event这个方法来捕获远程控制事件,并根据event.subtype来判别指令意图并作出反应。具体用法如下:

//在具体的控制器或其它类中捕获处理远程控制事件,当远程控制事件发生时触发该方法, 该方法属于UIResponder类,iOS 7.1 之前经常用- (void)remoteControlReceivedWithEvent:(UIEvent *)event{    NSLog(@"%ld",event.type);[[NSNotificationCenter defaultCenter] postNotificationName:@"songRemoteControlNotification" object:self userInfo:@{@"eventSubtype":@(event.subtype)}];
} /* iOS 7.1之前*///让App开始接收远程控制事件, 该方法属于UIApplication类[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];     //结束远程控制,需要的时候关闭//     [[UIApplication sharedApplication] endReceivingRemoteControlEvents];//处理控制台的暂停/播放、上/下一首事件[[NSNotificationCenter defaultCenter] addObserverForName:@"songRemoteControlNotification" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) {  NSInteger  eventSubtype = [notification.userInfo[@"eventSubtype"] integerValue];  switch (eventSubtype) {    case UIEventSubtypeRemoteControlNextTrack:    NSLog(@"下一首");   break;   case UIEventSubtypeRemoteControlPreviousTrack:   NSLog(@"上一首");  break;  case  UIEventSubtypeRemoteControlPause:[self.player pause];    break;    case  UIEventSubtypeRemoteControlPlay:[self.player play];  break;     //耳机上的播放暂停case  UIEventSubtypeRemoteControlTogglePlayPause:   NSLog(@"播放或暂停");     break;     //后退case UIEventSubtypeRemoteControlBeginSeekingBackward:  break;    case UIEventSubtypeRemoteControlEndSeekingBackward:  NSLog(@"后退");    break;     //快进case UIEventSubtypeRemoteControlBeginSeekingForward:    break;    case UIEventSubtypeRemoteControlEndSeekingForward:   NSLog(@"前进");  break;    default:  break;}}];
  • 在iOS7.1之后,出现了MPRemoteCommandCenter、MPRemoteCommand 及其相关的一些类 ,锁屏界面开启和监控远程控制事件就更方便了,而且还扩展了一些新功能:网易云音乐的列表菜单弹框功能和QQ音乐的拖拽控制台的进度条调节进度功能等等.....
    官方文档:https://developer.apple.com/documentation/mediaplayer/mpremotecommandcenter

   //锁屏界面开启和监控远程控制事件- (void)createRemoteCommandCenter{/**///远程控制命令中心 iOS 7.1 之后  详情看官方文档:https://developer.apple.com/documentation/mediaplayer/mpremotecommandcenterMPRemoteCommandCenter *commandCenter = [MPRemoteCommandCenter sharedCommandCenter];//   MPFeedbackCommand对象反映了当前App所播放的反馈状态. MPRemoteCommandCenter对象提供feedback对象用于对媒体文件进行喜欢, 不喜欢, 标记的操作. 效果类似于网易云音乐锁屏时的效果//添加喜欢按钮MPFeedbackCommand *likeCommand = commandCenter.likeCommand;likeCommand.enabled = YES;likeCommand.localizedTitle = @"喜欢";[likeCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {NSLog(@"喜欢");return MPRemoteCommandHandlerStatusSuccess;}];//添加不喜欢按钮,假装是“上一首”MPFeedbackCommand *dislikeCommand = commandCenter.dislikeCommand;dislikeCommand.enabled = YES;dislikeCommand.localizedTitle = @"上一首";[dislikeCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {NSLog(@"上一首");return MPRemoteCommandHandlerStatusSuccess;}];//标记MPFeedbackCommand *bookmarkCommand = commandCenter.bookmarkCommand;bookmarkCommand.enabled = YES;bookmarkCommand.localizedTitle = @"标记";[bookmarkCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {NSLog(@"标记");return MPRemoteCommandHandlerStatusSuccess;}];//    commandCenter.togglePlayPauseCommand 耳机线控的暂停/播放[commandCenter.pauseCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {[self.player pause];return MPRemoteCommandHandlerStatusSuccess;}];[commandCenter.playCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {[self.player play];return MPRemoteCommandHandlerStatusSuccess;}];//    [commandCenter.previousTrackCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {//        NSLog(@"上一首");//        return MPRemoteCommandHandlerStatusSuccess;//    }];[commandCenter.nextTrackCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {NSLog(@"下一首");return MPRemoteCommandHandlerStatusSuccess;}];//快进//    MPSkipIntervalCommand *skipBackwardIntervalCommand = commandCenter.skipForwardCommand;//    skipBackwardIntervalCommand.preferredIntervals = @[@(54)];//    skipBackwardIntervalCommand.enabled = YES;//    [skipBackwardIntervalCommand addTarget:self action:@selector(skipBackwardEvent:)];//在控制台拖动进度条调节进度(仿QQ音乐的效果)[commandCenter.changePlaybackPositionCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {CMTime totlaTime = self.player.currentItem.duration;MPChangePlaybackPositionCommandEvent * playbackPositionEvent = (MPChangePlaybackPositionCommandEvent *)event;[self.player seekToTime:CMTimeMake(totlaTime.value*playbackPositionEvent.positionTime/CMTimeGetSeconds(totlaTime), totlaTime.timescale) completionHandler:^(BOOL finished) {}];return MPRemoteCommandHandlerStatusSuccess;}];}-(void)skipBackwardEvent: (MPSkipIntervalCommandEvent *)skipEvent
{NSLog(@"快进了 %f秒", skipEvent.interval);
}

第二部分:歌词解析

  • 根据上图的歌词样式,思路就是:先根据换行符“\n“分割字符串,获得包含每一行歌词字符串的数组,然后解析每一行歌词字符,获得时间点和对应的歌词,再用创建的歌词对象wslLrcEach来存储时间点和歌词,最后得到一个存储wslLrcEach对象的数组.

  • //每句歌词对象
    @interface wslLrcEach : NSObject
    @property(nonatomic, assign) NSUInteger time ;
    @property(nonatomic, copy) NSString * lrc ;
    @end

    接下来就是要让歌词随歌曲的进度来滚动显示,主要代码如下:

     self.tableView  显示歌词的currentTime  当前播放时间点self.currentRow  当前时间点歌词的位置//歌词滚动显示for ( int i = (int)(self.lrcArray.count - 1); i >= 0 ;i--) {wslLrcEach * lrc = self.lrcArray[i];if (lrc.time < currentTime) {self.currentRow = i;[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow: self.currentRow inSection:0] atScrollPosition:UITableViewScrollPositionMiddle animated:YES];[self.tableView reloadData];break;}}

第三部分:项目截图

代码下载:http://www.demodashi.com/demo/10754.html

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

iOS 音乐播放器之锁屏效果+歌词解析相关推荐

  1. android 系统锁屏音乐播放器,Android实现音乐播放器锁屏页

    本文实例为大家分享了Android音乐播放器锁屏页的具体代码,供大家参考,具体内容如下 首页我们先看一下效果图 下边来说一下实现逻辑,其主要思路就是新建一个activity使其覆盖在锁屏页上边. 一. ...

  2. 关于音乐播放器锁屏播放,后台播放,封面显示等

    1. 如果应用需要后台播放:那么在appdelegate 中添加 [AVAudioSession *session = [AVAudioSession sharedInstance];[session ...

  3. 完美实现音乐播放器锁屏页

    首页我们先看一下效果图 下边来说一下实现逻辑,其主要思路就是新建一个activity使其覆盖在锁屏页上边. 一.我们新建一个LockActivty,既然是四大组件之一,必不可少的在AndroidMan ...

  4. 乐乐音乐:Android音乐播放器及动感(KTV)歌词相关博客汇总

    相关简介 Java Swing PC版本乐乐音乐播放器 乐乐音乐PC播放器单机版本,支持ape,wav,flac,mp3等多种格式,支持动态ksc.hrc.krc歌词文件和支持和显示翻译歌词和音译歌词 ...

  5. iOS音乐后台播放、锁屏封面及播放控制

    在默认情况下App被切换到后台时,音乐的就停止播放了,但音乐类App的一般都会需要在后台继续播放,这样用户就可以一边听音乐,一边操作其他的App.对于这种情况我们可以对App做一些简单的配置,实现后台 ...

  6. android音乐播放器之歌词下载、处理、开始、同步

    android音乐播放器之歌词下载.处理.开始.同步 ** 程序源代码在底部 ** 先来看看效果 下载 /*** 自定义下载方法,调用系统DownloadManager下载* * @param myU ...

  7. android qq音乐锁屏,仿照网易云和QQ音乐的锁屏效果

    仿照网易云和QQ音乐的锁屏效果 音乐app锁屏效果 参考网址:http://www.android100.org/html/201509/01/178176.html 使用三方侧滑库: https:/ ...

  8. ios音乐播放器-仿QQ音乐

    这篇文章主要写一个iOS系统下的音乐播放器 , 包括简单的仿QQ音乐播放器界面.音乐播放.歌词解析.后台控制等  ,如果你正好需要 , 希望你看完后能够对你的提升有所帮助 , 当然,阅读中如果发现什么 ...

  9. Android开源音乐播放器之播放器基本功能

    系列文章 Android开源在线音乐播放器--波尼音乐 Android开源音乐播放器之播放器基本功能 Android开源音乐播放器之高仿云音乐黑胶唱片 Android开源音乐播放器之自动滚动歌词 An ...

最新文章

  1. Ubuntu 16.04 命令行 关机 or 重启
  2. 关于Core Data的一些整理(一)
  3. nodejs和Vue和Idea
  4. Codeforces 999F Cards and Joy 【dp】【性质】
  5. centos8.4 nginx 问题
  6. 学习OpenStack之(6):Neutron 深入学习之 OVS + GRE 之 Compute node 篇
  7. python oct_Python oct()
  8. 21. Function 对象
  9. 微信小程序之去除抖音、快手等视频平台水印!
  10. 网游实时对战同步技术三篇
  11. android 手机 投影,100吋1080p 看Android双核手机连投影
  12. 数学之美--计算机图形学中的数学方法论
  13. 机房监控系统解说—新风机篇
  14. 安装mingw-w64失败解决方法
  15. 自动生成无课表(云南农业大学)
  16. intersect 相交 范围_空间关系分类及接口方法
  17. FastICA的原理及实现
  18. 黑马程序员——OC基础05—Foundation框架
  19. android 拨号隐藏号码,拨号锁应用隐藏器下载-拨号锁伪装应用程序隐藏器app 2.7.1 安卓版-我游网...
  20. 音视频开发之旅(16) OpenGL ES粒子效果-烟花爆炸

热门文章

  1. electron forge 好用吗_在优麒麟上使用 Electron 开发桌面应用
  2. 14012.petalinux小知识点
  3. 无源波分和彩光模块_5G前传WDM解决方案,无源波分和彩光模块
  4. 【声学基础】概述——传播
  5. 计算机系统操作技师考试题,机关事业单位技术工人计算机操作技师考试题库
  6. 英雄联盟微信登录服务器怎么回事,英雄联盟微信怎么登陆 lol微信登录功能开放大区一览...
  7. mysql有dataguard吗_Oracle查看是否搭建DataGuard
  8. 【LeetCode】【HOT】240. 搜索二维矩阵 II(抽象二叉搜索树)
  9. 【LeetCode】剑指 Offer 40. 最小的k个数
  10. linux -- su和sudo命令的区别